0%

SpringBoot自动配置的原理

需要先了解一下Spring的@Import注解和@Enable注解的实现原理,以及SpringFactoriesLoader的实现,再来看SpringBoot的自动配置原理就基本上会明白了。

SpringBoot应用一般都会在主类上注解@SpringBootApplication,这个注解上有@EnableAutoConfiguration注解,一般@Enable注解上都会有@Import注解,这里也不例外,有个@Import(EnableAutoConfigurationImportSelector.class)。

EnableAutoConfigurationImportSelector是一个ImportSelector,Spring在初始化的时候会调用invokeBeanFactoryPostProcessor,这里会调用实现了接口BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法,ConfigurationClassPostProcessor也实现了此接口,在该方法postProcessBeanDefinitionRegistry中会处理@Configuration相关注解,这里就进行了@Import注解的处理。对于ImportSelector,会调用它的selectImports方法进行处理。

EnableAutoConfigurationImportSelector的selectImports方法中会先使用SpringFactoriesLoader在classpath下的spring.factories文件中来加载@EnableAutoConfiguration类型的各种实现类,也包括各种starter中和我们自定义的starter中的对应实现类。SpringBoot中预先配置的EnableAutoConfiguration可以在spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories中查询,配置了很多很多个自动配置类。

加载完这些配置类的名字后,经过一系列的校验等操作,就会把所有的EnableAutoConfiguration实现类的名字都返回给Spring,Spring会继续的处理这些配置类,也就是处理这些配置类中的@Configuration、@Import这些注解,继续递归处理这些注解,最后把相关的Bean都注册到容器中。

坚持原创技术分享,您的支持将鼓励我继续创作!
Fork me on GitHub