在启动类上添加@SpringBootApplication
注解之后,相当于添加了三个注解
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
其中
1、@SpringBootConfiguration
注解就是@Configuration
,代表启动类是一个配置类;
2、@EnableAutoConfiguration
注解是开启自动配置类,该注解类上会通过@Import
注解导入AutoConfigurationImportSelector
类【核心类,实现了DeferredImportSelector接口,执行DeferredImportSelector.Group
类里面的方法进行自动配置类的去重、过滤】;由于重写了Group接口同时覆盖了getImportGroup
,所以并不会执行ImportSelector
接口方法的实现方法selectImports
, 具体流程同样在ConfigurationClassParser.parse
方法中
3、ComponentScan
进行组件扫描
执行的时机:
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
this.resourceLoader = resourceLoader;
Assert.notNull(primarySources, "PrimarySources must not be null");
this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
this.webApplicationType = WebApplicationType.deduceFromClasspath();
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
this.mainApplicationClass = deduceMainApplicationClass();
}
其中 getSpringFactoriesInstances(ApplicationContextInitializer.class)
会去解析META-INF/spring.factories
文件并放入缓存中。
org.springframework.context.support.AbstractApplicationContext#refresh
刷新容器的方法中,invokeBeanFactoryPostProcessors(beanFactory);
通过调用ConfigurationClassParser.parse
方法去调用上面AutoConfigurationImportSelector
里面方法进行自动配置类扫描。