SpringBoot三大注解

2,143 阅读1分钟

提出问题

在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中实现