@SpringBootApplication
@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
@SpringBootApplication
注解是由 @SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
三个注解合并而成的。下面分析这三个注解。
@SpringBootConfiguration
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}
@SpringBootConfiguration
就是 @Configuration
@ComponentScan
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
@ComponentScan
扫描Spring组件,比如注解Configuration
Controller
Service
等。如果没有指定扫描包,表示当前类的路径下。
SpringBoot排除 AutoConfigurationExcludeFilter
过滤器中的自动配置类。
AutoConfigurationExcludeFilter.java
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
return this.isConfiguration(metadataReader) && this.isAutoConfiguration(metadataReader);
}
由match方法可知,如果是Configuration,同时是AutoConfiguration才会扫描。Configuration类就是在类上加入@Configuration
的类。AutoConfiguration类就是在 spring.factories
配置的类。
/spring-boot-autoconfigure/META-INF/spring.factories
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
...
这些都属于自动配置类,不需要 @ComponentScan
去扫描。
EnableAutoConfiguration
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration
EnableAutoConfiguration
作用:
- 当我们的 classpath 中存在某些 jar 或者类时,默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件,帮助我们自动配置 bean;
- 当我们定义自己的配置时,自动配置的 bean 将不再加载。(具体是通过 一系列的 @ConditionalOnXxx 来实现的)
EnableAutoConfiguration
是由注解 @AutoConfigurationPackage
和 @Import({AutoConfigurationImportSelector.class})
组成。
AutoConfigurationPackage
注解的作用是将添加该注解的类所在的package 作为自动配置package进行管理。- @Import(AutoConfigurationImportSelector.class)
- 利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
- 调用List
configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类 - 利用工厂加载 Map<String, List
> loadSpringFactories(@Nullable ClassLoader classLoader)得到所有的组件 - 从META-INF/spring.factories位置来加载一个文件。
默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factorie
@EnableXxx 注解是用在 @Configuration
标记的类上,用来自动配置和加载一些 @Configuration
类或者@bean
的。 所以,@EnableXxx 一定是与 @Configuration
一起使用的。
@EnableXxx 一般会与 @Import
一起使用,通过 @Import
来达到自动配置的目的。
比如:EnableAsync
EnableCaching
参考文档: