@SpringBootApplication的作用

35 阅读1分钟

在启动类上添加@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里面方法进行自动配置类扫描。