摘要:本文分析了@SpringBootApplication注解的组成,着重介绍了@EnableAutoConfiguration的组成,以及其运作流程
SpringBootApplication注解解析
@SpringBootApplication 其实是由三个注解组成的
- SpringBootConfiguration
- EnableAutoConfiguration
- ComponentScan
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM,classes = {
TypeExcludeFilter.class}), @Filter(type = FilterType.CUSTOM, classes = {
AutoConfigurationExcludeFilter.class})})
public @interface SpringBootApplication {
为了理解@SpringBootApplication这个注解,我们将目标拆分,挨个分析组成@SpringBootApplication的注解
首先来看@SpringBootConfiguration
@SpringBootConfiguration
@Configuration//这里表示SpringBootConfiguration这个类是一个配置类
public @interface SpringBootConfiguration {
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
因为@Configuration修饰@SpringBootConfiguration,而@SpringBootConfiguration 修饰 @SpringBootApplication
而@SpringBootApplication 修饰 XxxMainApplication,所以XxxMainApplication其实也相当于被@Configuration修饰了,那么XxxMainApplication其实也就是个配置类==(套娃注解)==
@ComponentScan
注解扫描
@EnableAutoConfiguration
前面两个都意义都不是很大,这个才是硬菜
我们从这个注解的声明来看,可以发现这个注解其实也是一个复合注解,它被
- @AutoConfigurationPackage
- Import修饰着,我们前面讲过@Import可以自动的调用指定类的无参构造器创建对象,并将其放在IOC容器中,这里就是将AutoConfigurationImportSelector这个类的对象放入IOC容器中了
@AutoConfigurationPackage
@Import({
AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration
第一条支线:@AutoConfigurationPackage
- 进入
@AutoConfigurationPackage
的源码中我们可以看到,这个类通过@Import
导入了Registrar.class
@Import({
Registrar.class})
public @interface AutoConfigurationPackage {
String[] basePackages() default {
};
Class<?>[] basePackageClasses() default {
};
}
- 进入Registrar这个类,我们发现这是一个静态内部类
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
}
这个类中有一个重要的方法registerBeanDefinitions
这个方法传入了两个参数:(1)AnnotationMetadata metadata;(2)BeanDefinitionRegistry registry
这个方法的目的是什么呢?其实是:往容器中批量注册组件
pub