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了(文末含新年答谢红包福利)相关推荐

  1. spring boot启动类启动 错误: 找不到或无法加载主类 xxx.xxxx.Application 的解决方法

    spring boot启动类启动 错误: 找不到或无法加载主类 xxx.xxxx.Application 的解决方法 导入的一个外部的spring boot项目,运行启动类,忽然提示找不到或者无法加载 ...

  2. spring boot 踩坑日记: 错误: 找不到或无法加载主类 xxx.xxx.xxx

    错误信息: 错误: 找不到或无法加载主类 io.sr.SrDhTraApplication 解决: 在pom.xm文件中指明启动类位置: 代码: <configuration><fo ...

  3. Spring Boot 1.0和Spring Boot 1.0.1错误修复版本

    Spring Boot团队最近宣布了Spring Boot 1.0版本 ,随后是Spring Boot 1.0.1.RELEASE ,这是一个错误修复版本,其中还包含一些新功能. Spring Boo ...

  4. Spring Boot笔记-普通异常错误截取及构造错误页面

    在web开发过程中,数据问题会有异常,会抛到页面上,这样造成用户体验差. 目前这个笔记是使用Spring Boot获取异常,并构造新的界面 程序运行截图如下: 另外一个: 这样的话就达到了页面友好的效 ...

  5. Spring Boot请求403 Forbidden错误

    欢迎关注笔者的微信公众号 在项目中引入了Spring Security框架做权限控制,但是出于调试的方便,在开始的时候就禁用了Spring Security,计划到项目后期再专门开发. 但是,在调试的 ...

  6. 这 7 个 Spring Boot 项目够经典!

    点击上方逆锋起笔 ,选择"置顶公众号" 优质文章,第一时间送达 前言 不得不佩服 SpringBoot 的生态如此强大,今天给大家推荐几款优秀的后台管理系统,小伙伴们再也不用从头到 ...

  7. spring boot 整合 jetcache 相关错误

    版本: jdk1.8 spring boot 2.2.5.RELEASE jetcache-starter-redis 2.6.0 spring boot 版本升级到2.2.2 以上版本,jetcac ...

  8. 这 6 个 Spring Boot 项目够经典

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:Nginx 为什么快到根本停不下来?个人原创100W+访问量博客:点击前往,查看更多 不得不佩服 Spring B ...

  9. 我这样回答了Spring 5的新特性,面试官对我刮目相看 | 文末送书

    最近,有一个小伙伴拿到了自己满意的Offer,和他交谈的过程中得知他面试官问他关于Spring的问题比较多,其中最让面试官满意的就是自己回答关于Spring 5的知识点回答的不错. Spring5是2 ...

最新文章

  1. ROS与深度相机入门教程:(1)Ubuntu16.04 在ROS中驱动Intel D435i深度相机
  2. python字典导入mongodb_Python中的有序字典:添加到MongoDB
  3. Docker 图形化页面管理工具使用
  4. 赛迪顾问2010-2011年度中国信息安全产品市场研究年度报告
  5. ML 05、分类、标注与回归
  6. java 字符串模糊匹配_Java实现伪查询(全匹配+模糊匹配)
  7. Linux虚拟机sqlite数据库安装教程、命令实现sqlite
  8. webpack4.0各个击破(9)—— karma篇
  9. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(11) - 数据可缓存性控制指令
  10. mac好用的图片转文字,ocr文字识别工具:Text Scanner
  11. 简述html文档的基本,网页制作简答题答案
  12. diagrams软件 可替换visio ProcessOn 亿图图示
  13. 看拉扎维《模拟CMOS集成电路设计》的一些总结和思考(三)——单级放大器
  14. php递归函数的用法,PHP递归函数用法
  15. win7计算机上缺少网络协议,win7系统安装ipx协议提示找不到相应的模块的解决方法...
  16. 路由器当交换机用,应该怎样配置?
  17. Python学习笔记——工欲善其事,必先利其器
  18. 生产线平衡优化毕业论文【flexsim仿真】
  19. 详情页用虚拟机还是云服务器,详情页用虚拟机还是云服务器
  20. 智掌柜扫码点单,帮助店家解决开店烦恼

热门文章

  1. 基于itext 7对PDF进行处理(包含图片填充)
  2. flume http sink
  3. 计算机系迎新主题,计算机系迎新庆国庆晚会异彩纷呈
  4. python dataframe loc函数_详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)...
  5. HTML中简单的声音语音MP3播放代码
  6. 计算机教研组工作措施,初中信息技术(计算机)教研组工作计划第二学期
  7. python transitions库 表示状态机
  8. Nexus7和Android4.1
  9. dcom配置计算机下没有,OPC服务器DCOM配置
  10. 畅谈绿色数据库的应用