咦!Spring容器里为什么没有我需要的Bean?
小故事
有一天,项目经理收到一个紧急需求,需要新增一个模块,项目经理看了看开发区的同学,一眼就看到盯着屏幕笑嘻嘻的小菜同学
项目经理心想:这傻小子在乐什么呢,肯定是在摸鱼,就让新需求给他做吧
项目经理悄咪咪的偷摸到小菜身后,看着小菜在沸点评论区不停的滑动,似乎在寻找着什么大瓜
此时的小菜似乎察觉到气氛不太对劲,身后似乎有人,于是飞快的按下 Windows 1 弹出Idea的开发界面
此时,项目经理开口道:小菜啊,这里有个紧急需求,新增了一个模块,你新建一个SpringBoot项目把这些需求写一下吧~
小菜只能不情愿的接到需求,从而放弃摸鱼,开始开发
精通CRUD的小菜立马Copy出一个新项目
很快啊,啪的一下~写出启动类加上@SpringBootApplication
注解
package com.caicaijava.springbooteasyframeworks;
@SpringBootApplication
public class SpringBootEasyFrameworksApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootEasyFrameworksApplication.class, args);
}
}
然后小菜建立了一个controller包开始认真开发...
没过多久,小菜就把需求都搞定了,于是启动服务开始测试
小菜打开测试工具就开始测试接口,但是怎么测试都是404,一开始小菜还以为url写错了,但是检测后发现并没有写错
经过小菜漫长的排查,终于发现了问题:原来是小菜把controller包不小心创建在springbooteasyframeworks
包的同级目录
启动类中的@SpringBootApplication
中包含@ComponentScan
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
@ComponentScan
**会去扫描包下的组件,并把组件加入到容器中,由于没有配置**basePackages
**字段,于是只会扫描当前包下的组件**
当前包也就是com.caicaijava.springbooteasyframeworks
于是controller包与其同级时无法扫描其中的组件,因此导致容器中找不到对应的Bean
如果需要扫描其他包,或者需要依赖公共项目common下的包时,可以使用配置basePackages
,如果已经配置**basePackages
**则不会默认扫描当前包,于是也要把当前包加上
@SpringBootApplication
@ComponentScan(basePackages = {"com.caicaijava.common","com.caicaijava.springbooteasyframeworks"})
public class SpringBootEasyFrameworksApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootEasyFrameworksApplication.class, args);
}
}
总结
@SpringBootApplication
**默认只扫描当前包下的组件,如果需要扫描其他包,需要配置**@ComponentScan
**的**basePackages
**或**value
**字段**
当配置过**@ComponentScan
**时,默认不会扫描当前包下的组件,注意把当前包也加入配置