引入@ComponentScan注解注册bean容器后,导致的接口404问题
背景
由于微服务开发中,经常需要在公共模块在引入一些公共模块,供其他服务使用,但是其他服务需要在启动类中配置@ComponentScan
注解扫描这个公共模块下注册的 bean,但是,如果我们配置了@ComponentScan
并且扫描了公共模块下的 bean,那么将会破坏@ComponentScan
默认扫描的包,也就是@ComponentScan
默认扫描的启动类同级目录下的包会破坏,此时我们当前模块的所有包都不会被注册,也就导致了 web 项目找不到控制器,从而报错 404。
@ComponentScan
注解作用是扫描注解里面的包名从中找到定义的bean,但是问题是不用@ComponentScan
注解的话,项目会默认扫描@SpringBootApplication
注解所在路径的同级和下级的所有子包,使用@ComponentScan
后他会取代掉默认扫描。
启动类使用@ComponentScan:
此时该模块只会将shopping_common
模块中 component
包下的 JavaBean 注册而丢掉了默认注册的启动类同级目录下的 bean,像controller
里的bean对象是不会被扫描到的,所以接口报404
.
报错信息
解决方式
- 去掉@ComponentScan注解,把项目中的所有包都放在启动类的同级或者子级目录下,使用默认的扫描模式。(推荐)
- 在@ComponentScan中加入所有需要被扫描的包名(不推荐【如果在微服务模块中,每个模块都需要映入公共模块中注册的一些 bean 容器,为了避免在每个模块启动类同级目录都创建该 bean,只能使用这样的方法】),例如
总结
刚刚的案例中使用@ComponentScan注解,漏掉了本工程下的包名称,导致没有扫描到启动类同一级下面的包。因此像controller
里的bean对象是不会被扫描到的,所以接口报404
,所以引入其他jar包或者引入不在启动类同一级下的包时,需要注意增加扫描注解或配置文件,扫描全部需要spring管理的包全路径。