提出问题
在SpringBoot的启动类中,只有一个@SpringBootApplication的注解,点进去会发现它是一个复合注解,由@SpringBootConfiguration,@EnableAutoConfiguration和@ComponentScan组成,被称为SpringBoot三大注解
阅读此文前必须了解《ConfigurationClassPostProcessor源码探究与SpringBoot三大注解铺垫》的内容
我们来解决上文提出的两个问题
- 有时被@ComponentSacn扫到的AutoConfiguration不满足@Conditional条件
- SpringBoot三大注解(@SpringBootConfiguration, @EnableAutoConfiguration, @ComponentScan)如何工作
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
// 省略...
}
1 @SpringBootConfiguration
它相当于是一个@Configuration注解,使用它是为了方便在Spring Test中被发现. 本质上属于@Configuration,这是个Spring很很很重要的配置注解,具体使用方法请参考官方文档,源码相关可了解.........一文
2 @EnableAutoConfiguration
2.1 AutoConfigurationImportSelector
它实现了自动装配功能,是一个DeferredImportSelector,具体分析可以参考《ConfigurationClassPostProcessor源码探究与SpringBoot三大注解铺垫》的1.4章节
2.2 AutoConfigurationPackage
是一个ImportBeanDefinitionRegistrar,将AutoConfigurationPackages注册到BeanFactory,供其他功能使用,官方注释写的是JPA entity scanner,但暂时我没看到比较常用的做法.
3 @ComponentScan
这个大家都很熟悉了,默认扫描@Component,在SpringBoot里会增加两个excludeFilters:
- TypeExcludeFilter, 方便用户实现自定义的Filter,主要用于Spring Test中
- AutoConfigurationExcludeFilter, 忽略@Configuration和EnableAutoConfiguration 正因如此,通常SpringBoot不会错误扫描到自动装配类
4 解决问题
- 有时被@ComponentSacn扫到的AutoConfiguration不满足@Conditional条件
通常情况下AutoConfigurationExcludeFilter能跳过,但是如果你的AutoConfiguration类不符合一般规范,就会被@ComponentScan提早扫到,影响加载顺序
- SpringBoot三大注解(@SpringBootConfiguration, @EnableAutoConfiguration, @ComponentScan)如何工作
其实本质上由@Configuration + @ComponentScan + AutoConfigurationImportSelector组成,都是在ConfigurationClassPostProcessor中实现