Spring Boot 使用的经典错误-找不到Bean了(文末含新年答谢红包福利)
Spring对于Java开发者来说,熟悉程度大概与word、excel这些office软件相当。这是个人猜测,大家也可以来投个票:
它简单易用,极大降低了开发人员的门槛。但是,它毕竟是建立在很多约定俗成的规则之上。而这些约定并不一定是你所熟悉的。所以,当你遇到问题时,很有可能就抓狂了。
前段时间我做了网络编程的系列课程,过年了,咱们换换脑子。争取不太烧脑的情况下,来一个spring避坑指南的系列课程。
问题
在使用 @Autowired 时,不管你是菜鸟级还是专家级的 Spring 使用者,都应该制造或者遭遇过类似的错误:
required a bean of type 'xxx' that could not be found
在构建 Web 服务时,我们常使用 Spring Boot 来快速构建。
例如,使用下面的包结构和相关代码来完成一个简易的 Web 版 HelloWorld:其中,负责启动程序的 Application 类定义如下:
@SpringBootApplication
public class Application {public static void main(String[] args) throws Exception {SpringApplication.run(Application.class, args);}
}
提供接口的 HelloWorldController 代码如下:
@RestController
public class HelloWorldController {@GetMapping(path = "hi")public String hi() {return "新年快乐!";}
}
不出意外,访问时结果应该如下所示:
其中 HelloWorldController 因为添加了 @RestController,最终被识别成一个 Controller 的 Bean。
但是,假设有一天,我们希望用更清晰的包层次和结构来管理时,可能将Application 移动到一个单独的目录下,比如下面这样:
这时候访问就404了:
实际上,我们没有改变任何代码,只是改变了包的结构,但是我们会发现这个 Web 应用失效了,即不能识别出 HelloWorldController 了。也就是说,我们找不到 HelloWorldController 这个 Bean 了。这是为何?
解析
要了解 HelloWorldController 为什么会失效,就需要先了解之前是如何生效的。对于 Spring Boot 而言,关键点在于 Application.java 中使用了 SpringBootApplication 注解。而这个注解继承了另外一些注解,具体定义如下:
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {@Filter(type = FilterType.CUSTOM,classes = {TypeExcludeFilter.class}
), @Filter(type = FilterType.CUSTOM,classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
从定义可以看出,SpringBootApplication 开启了很多功能,其中一个关键功能就是 ComponentScan。当 Spring Boot 启动时,ComponentScan 的启用意味着会去扫描出所有定义的 Bean,那么扫描什么位置呢?这是由 ComponentScan 注解的 basePackages 属性指定的。
直接使用的是 SpringBootApplication 注解定义的 ComponentScan,它的 basePackages 没有指定,所以默认为空(即{})。此时扫描的是什么包?
当 basePackages 为空时,扫描的包会是 declaringClass 所在的包,在本案例中,declaringClass 就是 Application,所以扫描的包其实就是它所在的包。因为后来移动目录后 Application 所在的包为 com.brmayi.concise.startup ,没有包含 HelloWorldController 所在的 com.brmayi.concise 。就扫描不到了。
这就是为什么一般咱们都会把 Application 放到项目最外层目录。这样,它所在的目录以及子目录都可以扫描到。
另外,我们也可以使用 @ComponentScans 来修复问题。
福利时间
有朋友让我拉群发红包。问题是:拉了群我说点啥呢。12月份的时候,我一看今年用户量增长很少,发力写了几篇文章。同时,也得到了贵人相助,用户增长终于完成了“KPI”。虽然我不知道贵人具体是谁,但是肯定和咱们用户朋友有很大的关系。答谢是应该的。
要做就做大的,我拉群,大家帮忙拉人进去,争取拉满500人。聊天你们聊,我只管过年发红包。
Spring Boot 使用的经典错误-找不到Bean了(文末含新年答谢红包福利)相关推荐
- spring boot启动类启动 错误: 找不到或无法加载主类 xxx.xxxx.Application 的解决方法
spring boot启动类启动 错误: 找不到或无法加载主类 xxx.xxxx.Application 的解决方法 导入的一个外部的spring boot项目,运行启动类,忽然提示找不到或者无法加载 ...
- spring boot 踩坑日记: 错误: 找不到或无法加载主类 xxx.xxx.xxx
错误信息: 错误: 找不到或无法加载主类 io.sr.SrDhTraApplication 解决: 在pom.xm文件中指明启动类位置: 代码: <configuration><fo ...
- Spring Boot 1.0和Spring Boot 1.0.1错误修复版本
Spring Boot团队最近宣布了Spring Boot 1.0版本 ,随后是Spring Boot 1.0.1.RELEASE ,这是一个错误修复版本,其中还包含一些新功能. Spring Boo ...
- Spring Boot笔记-普通异常错误截取及构造错误页面
在web开发过程中,数据问题会有异常,会抛到页面上,这样造成用户体验差. 目前这个笔记是使用Spring Boot获取异常,并构造新的界面 程序运行截图如下: 另外一个: 这样的话就达到了页面友好的效 ...
- Spring Boot请求403 Forbidden错误
欢迎关注笔者的微信公众号 在项目中引入了Spring Security框架做权限控制,但是出于调试的方便,在开始的时候就禁用了Spring Security,计划到项目后期再专门开发. 但是,在调试的 ...
- 这 7 个 Spring Boot 项目够经典!
点击上方逆锋起笔 ,选择"置顶公众号" 优质文章,第一时间送达 前言 不得不佩服 SpringBoot 的生态如此强大,今天给大家推荐几款优秀的后台管理系统,小伙伴们再也不用从头到 ...
- spring boot 整合 jetcache 相关错误
版本: jdk1.8 spring boot 2.2.5.RELEASE jetcache-starter-redis 2.6.0 spring boot 版本升级到2.2.2 以上版本,jetcac ...
- 这 6 个 Spring Boot 项目够经典
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:Nginx 为什么快到根本停不下来?个人原创100W+访问量博客:点击前往,查看更多 不得不佩服 Spring B ...
- 我这样回答了Spring 5的新特性,面试官对我刮目相看 | 文末送书
最近,有一个小伙伴拿到了自己满意的Offer,和他交谈的过程中得知他面试官问他关于Spring的问题比较多,其中最让面试官满意的就是自己回答关于Spring 5的知识点回答的不错. Spring5是2 ...
最新文章
- ROS与深度相机入门教程:(1)Ubuntu16.04 在ROS中驱动Intel D435i深度相机
- python字典导入mongodb_Python中的有序字典:添加到MongoDB
- Docker 图形化页面管理工具使用
- 赛迪顾问2010-2011年度中国信息安全产品市场研究年度报告
- ML 05、分类、标注与回归
- java 字符串模糊匹配_Java实现伪查询(全匹配+模糊匹配)
- Linux虚拟机sqlite数据库安装教程、命令实现sqlite
- webpack4.0各个击破(9)—— karma篇
- Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(11) - 数据可缓存性控制指令
- mac好用的图片转文字,ocr文字识别工具:Text Scanner
- 简述html文档的基本,网页制作简答题答案
- diagrams软件 可替换visio ProcessOn 亿图图示
- 看拉扎维《模拟CMOS集成电路设计》的一些总结和思考(三)——单级放大器
- php递归函数的用法,PHP递归函数用法
- win7计算机上缺少网络协议,win7系统安装ipx协议提示找不到相应的模块的解决方法...
- 路由器当交换机用,应该怎样配置?
- Python学习笔记——工欲善其事,必先利其器
- 生产线平衡优化毕业论文【flexsim仿真】
- 详情页用虚拟机还是云服务器,详情页用虚拟机还是云服务器
- 智掌柜扫码点单,帮助店家解决开店烦恼
热门文章
- 基于itext 7对PDF进行处理(包含图片填充)
- flume http sink
- 计算机系迎新主题,计算机系迎新庆国庆晚会异彩纷呈
- python dataframe loc函数_详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)...
- HTML中简单的声音语音MP3播放代码
- 计算机教研组工作措施,初中信息技术(计算机)教研组工作计划第二学期
- python transitions库 表示状态机
- Nexus7和Android4.1
- dcom配置计算机下没有,OPC服务器DCOM配置
- 畅谈绿色数据库的应用