Spring Boot自动配置(原理篇)

Spring Boot的自动配置,主要基于Spring的@Enable*注解和@Conditional注解。

在Spring Boot项目的main函数所在的类上,有@SpringBootApplication注解


                                          图一

该注解是一个组合注解,包括了@EnableAutoConfiguration


                                          图二

@EnableAutoConfiguration便是自动配置的起点,@EnableAutoConfiguration也是一个组合注解,功能和@EnableAsyc,@EnableScheduling,@EnableAspectJAutoProxy基本相同,都是基于Spring的@Enable*注解的工作原理:所有的注解都有一个@Import注解用来导入配置类的,导入配置类的方法有三种:

  1. 直接导入配置类。配置类与spring普通的配置类相同,有@Configuration和@Bean注解。
  2. 依据条件选择配置类。@EnableAutoConfiguration就是使用这种方式,见图三,AutoConfigurationImportSelector类的根接口为ImportSelector,重写其selectImports方法,在此方法内进行事先条件判断,见图四。
  3. 动态注册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包下。

猜你喜欢

转载自my.oschina.net/wuqingyi/blog/1818838