背景
今天遇到了一个关于spring boot 组件@ComponentScan 中basePackages 使用通配符* 找不到Bean的问题
目录结构中BussinessPerson与Dog类中都有标注有@Component注解,结果扫描不到。
然后删除通配符,结果运行成功。
之后修改成了**通配符,结果也运行成功了。
之后打了个断点,查看了这三种情况时,classPath的路径。结果如下:
结果分析:
@ComponentScan(basePackages = "com.ofo.test")当basePackages的直使用通配符,使用**,不能使用*。
- basePackages.:这种情况路径后缀会变成/*/.class,组件只会扫描路径包中的子包里面的类,而当前包中的Bean不会被扫描到。
- basePackages.: 这种情况路径后缀会变成/*/.class,组件会扫描当前包以及子包中的Bean.
- basePackages:这种情况路径后缀会变成/*/.class,组件会扫描当前包以及子包中的Bean.
另一个例子说明
@ComponentScan("com.fred.bean") @ComponentScan("com.fred.bean.*")
例如项目结构如下图
- @ComponentScan(“com.fred.bean”)
这种情况会扫描到以下Bean
不带.*的情况是扫描bean包下所有Bean(前提是Bean有注解@Controller、@Service、@Repository、@Component 中的其中一个)会递归包扫描。
- @ComponentScan(“com.fred.bean.*”)
这种情况会扫描到以下Bean
扫描会除去bean当前包下的Bean,当前bean包下的所有包都会扫描,也会递归包扫描。(前提是Bean有注解@Controller、@Service、@Repository、@Component 中的其中一个)