在SpringBoot的启动类中,只有一个@SpringBootApplication的注解,点进去会发现它是一个复合注解,由@SpringBootConfiguration,@EnableAutoConfiguration和@ComponentScan组成,被称为SpringBoot三大注解
阅读此文前必须了解《ConfigurationClassPostProcessor源码探究与SpringBoot三大注解铺垫》的内容
我们来解决上文提出的两个问题
@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 { // 省略... } 复制代码
它相当于是一个@Configuration注解,使用它是为了方便在Spring Test中被发现. 本质上属于@Configuration,这是个Spring很很很重要的配置注解,具体使用方法请参考官方文档,源码相关可了解.........一文
它实现了自动装配功能,是一个DeferredImportSelector,具体分析可以参考《ConfigurationClassPostProcessor源码探究与SpringBoot三大注解铺垫》的1.4章节
是一个ImportBeanDefinitionRegistrar,将AutoConfigurationPackages注册到BeanFactory,供其他功能使用,官方注释写的是JPA entity scanner,但暂时我没看到比较常用的做法.