Spring Boot的自动配置,主要基于Spring的@Enable*注解和@Conditional注解。
在Spring Boot项目的main函数所在的类上,有@SpringBootApplication注解
图一
该注解是一个组合注解,包括了@EnableAutoConfiguration
图二
@EnableAutoConfiguration便是自动配置的起点,@EnableAutoConfiguration也是一个组合注解,功能和@EnableAsyc,@EnableScheduling,@EnableAspectJAutoProxy基本相同,都是基于Spring的@Enable*注解的工作原理:所有的注解都有一个@Import注解用来导入配置类的,导入配置类的方法有三种:
- 直接导入配置类。配置类与spring普通的配置类相同,有@Configuration和@Bean注解。
- 依据条件选择配置类。@EnableAutoConfiguration就是使用这种方式,见图三,AutoConfigurationImportSelector类的根接口为ImportSelector,重写其selectImports方法,在此方法内进行事先条件判断,见图四。
- 动态注册Bean。
图三
图四
在getCandidateConfigurations方法中使用SpringFactoriesLoader.loadFactoryNames方法来扫描具有META-INF/spring.factories文件的jar包,获取登记在spring.factories文件中的配置类,过滤掉不符合的配置类,返回剩下的符合的配置类,最后加载这些配置类,这就是Spring Boot的自动配置的原理和基本流程。
回过头来看,@Conditional注解好像都没有讲起,整个过程和Spring的@Enable*的工作原理并没有什么区别,其实,@Conditional注解主要是用于过滤掉不符合的配置类。一个自动配置要能生效,既不能出现在@SpringBootApplication注解的exclude参数中,也要满足被@Conditional注解的注解的条件。这些被@Conditional注解的注解,通常放在spring-boot-auto-configure-x.x.x.x.jar的org.springfram-work.boot.autoconfigure.condition包下。