@SpringBootApplication
SpringBootApplication是一个组合注解,以2.3.0.RELEASE为例注解分别如下,我们来逐个分析一下这些注解的作用
@Target(ElementType.TYPE)
这是java的元注解,java中元注解有四个: @Retention @Target @Document @Inherited;元注解只能对注解进行注解
该注解是指定注解的作用目标,ElementType.TYPE指的是做的目标为接口、类、枚举
@Retention(RetentionPolicy.RUNTIME)
注解会在class字节码文件中存在,在运行时可以通过反射获取到
@Documented
说明该注解将被包含在javadoc中
@Inherited
说明子类可以继承父类中的该注解
@SpringBootConfiguration
首先该注解语义上有@Configuration注解类完全一致,还不是为了SpringBoot配置自成体系而专门开发的注解。
@ComponentScan
这个注解不是字面意义上的扫描器,其实这个只是配置了扫描指令,为的是配合@EnableAutoConfiguration去进行扫描。如果没有指定的话默认是从注解的类的同级及其子孙包下面进行扫描,所以也解释了为什么@SpringBootApplication注解的类要在最外层。
该注解指定了以下几种扫描方式:
- String[] basePackages()根据包名进行扫描(默认方式)
- Class<?>[] basePackageClasses()根据类进行扫描
- Class<? extends BeanNameGenerator> nameGenerator() 用于扫描在spring容器中命名过的类
- Filter[] includeFilters() 指定包含的过滤器,可以定制过滤器
- Filter[] excludeFilters() 指定不包含的过滤器,可以定制过滤器,如果发生指定不包含失效的情况,很有可能是A指定的scan不扫描C包,但是B指定的scan扫描了C包导致的。
@EnableAutoConfiguration(重点)
理解这个注解之前我们先了解一下这一些列注解@EnableXXX
@EnableXXX
@EnableXXX注解一般用于开启某一项功能,是为了简化代码的导入,即使用了该类注解,就会自动导入某些类。所以该类注解是组合注解,一般都会组合一个@Import 注解,用于导入指定的多个类,而被导入的类一般分为三种:配置类、选择器,与注册器
- 配置类:@Import 中指定的类一般以 Configruation 结尾,且该类上会注解@Configuration,表示当前类为一个配置类。
- 选择器:@Import 中指定的类一般以 Selector 结尾,且该类实现了ImportSelector 接口,表示当 前类会根据条件选择要导入的类。
- 注册器:@Import 中指定的类一般以 Registrar 结尾,且该类实现了 ImportBeanDefinitionRegistrar接口,用于导入注册器,该类可以在代码运行时动态注册指定类的实例。
@Import(AutoConfigurationImportSelector.class)
该注解是一个选择器,导入各种的自动化配置类。
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
+ "are using a custom packaging, make sure that file is correct.");
return configurations;
}
这是主要的业务处理逻辑,这些自动配置类是从哪里定义的,我们参考SpringFactoriesLoader。
/**
* The location to look for factories.
* <p>Can be present in multiple JAR files.
*/
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
META-INF/spring.factories这个文件是springboot自动配置的重中之重
这里面包含了各种组件的自动配置类,这也是springboot去掉各种XML文件的秘密所在。这些AutoConfiguration会读取yml中的配置完成自动配置。读取操作后续再来讲解。
@AutoConfigurationPackage
指定扫描application类所在的包以及子孙包下面的自定义的自动配置类。