@SpringBootConfiguration允许配置自动发现的具体含义是什么?
首先明确一个基本前提:@SpringBootConfiguration 是Spring Boot提供的 @Configuration 派生注解,它本身的元注解就包含@Configuration,因此它完全继承了@Configuration的所有能力:比如@Bean方法的CGLIB代理逻辑(proxyBeanMethods属性控制full/lite模式)、配置类的生命周期管理等,和普通@Configuration没有功能上的区别。
「@SpringBootConfiguration允许配置被自动发现」的具体含义
这里的自动发现特指 Spring Boot 内置的启动、扩展流程会主动识别该注解,不需要用户额外指定路径,具体对应两个核心场景:
- 主配置类自动检测:当你使用
java -jar启动Spring Boot可执行jar时,Spring Boot默认会扫描classpath下所有标注了@SpringBootConfiguration的类作为主启动配置类。如果你的启动类只标注了@Configuration,Spring Boot默认无法识别到主配置入口,必须手动通过SpringApplication.setSources()、spring.main.sources配置参数或者启动命令传参指定主配置类才能正常启动。我们平时使用的@SpringBootApplication注解本身就包含@SpringBootConfiguration,因此标注了该注解的启动类可以被自动识别。 - 扩展组件自动识别:Spring Boot的内置扩展组件(比如DevTools配置检测、配置元数据生成、测试框架的配置扫描逻辑)会优先识别标注了
@SpringBootConfiguration的类作为项目自定义配置类,不需要额外配置扫描规则就能自动加载这些配置中的扩展能力,普通@Configuration需要匹配对应组件的扫描规则才能被识别。
为什么标注@Configuration的类也能加载@Bean?
这个现象和两个注解的差异无关,本质是你的@Configuration类被项目的组件扫描逻辑覆盖了:
默认情况下@SpringBootApplication附带的@ComponentScan会扫描启动类所在包及所有子包下的所有@Component派生注解(包括@Configuration),放在这些路径下的@Configuration类自然会被加载,里面的@Bean也会被实例化。
如果你把@Configuration类放到组件扫描范围外的包,又没有通过@Import、spring.sources等方式主动引入,这些配置类完全不会被加载,内部的@Bean也不会实例化。
注:部分文章提到的「二者唯一差异」描述并不完全严谨,从Spring Boot 2.2版本开始
@SpringBootConfiguration也提供了和@Configuration完全一致的proxyBeanMethods属性,两者除了Spring Boot内置逻辑的识别规则外,没有任何功能区别。
内容的提问来源于stack exchange,提问作者Dilee

