Spring Boot自动配置原理
简介
- 首先是通过@SpringBootApplication注解标注启动类启动Springboot应用。
- @SpringBootApplication内被@EnableAutoConfiguration标注。
- 右@EnableAutoConfiguration注解内的@Import(AutoConfigurationImportSelector.class)加载配置信息。
- AutoConfigurationImportSelector.class实现了ImportSelect接口的selectImports()方法,该方法会读取所有路径下的META-INF/spring.factories。
- 读取spring.factories完毕后会扫描所有自动配置类,通过spring容器实现自动配置。
出发点@SpringBootApplication
@SpringBootApplication注解内部,依赖多个注解,大部分注解都是java的常规注解,看命名就能发现@EnableAutoConfiguration这个注解应该是我们想要的,所以继续看这个注解。
深入@EnableAutoConfiguration
- @SpringBootApplication的源码
@EnableAutoConfiguration注解被两个注解标注一个是@AutoConfigurationPackage注解,一个是@import一个类:AutoConfigurationImportSelector.class
- @EnableAutoConfiguration的源码
@AutoConfigurationPackage注解的功能:启动自动配置,该注解开启,使用Spring boot启动项目时,就会把找的jar包,自动配置整合。
- AutoConfigurationImportSelector.class的源码
该类一共实现了6个接口
第一个接口@DeferredImportSelector,他还继承一个父接口:ImportSelect
@ImportSelect主要作用是收集需要导入的配置类,如果该接口的实现类同时实现EnvironmentAware, BeanFactoryAware ,BeanClassLoaderAware或者ResourceLoaderAware,那么在调用其selectImports方法之前先调用上述接口中对应的方法,如果需要在所有的@Configuration处理完在导入时可以实现DeferredImportSelector接口。
4. 实现该接口的方法:selectImports()
该方法内部掉用了一个getAutoConfigurationEntry()方法,深入其内部查看源码
核心在与获取的configurations,我们会发现途中圈出的这行代码之后的操作,都是围绕configurations这个对象来进行的。
5. getCandidateConfigurations()方法
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.loadFactoryNames()这个方法,通过该方法加载配置。
- SpringFactoriesLoader.loadFactoryNames()方法
核心来了,在该方法中会读取META-INF/spring.factories下的所有内容
classLoader.getResources(“META-INF/spring.factories”) : ClassLoader.getSystemResources(“META-INF/spring.factories”);
而每个META-INF/spring.factories则是spring-boot-autoconfiguration这个jar内部的spring.factories,该文件中包含了所有需要自动配置的类
springboot服务,通过服务入口类的注解,实现自动配置能力,实现的流程时,在启动时,会去扫描resources/META-INF路径下的spring.factories里的自动配置类,从而实现类的自动配置。
最终实现类的自动配置
详情请参考文章XXXX,看如何编写一个自动配置类,并且使用它,对于理解Spring Boot的自动配置更加有帮助。
参考资源
1.配置参照