Spring Boot自动配置原理分析


Spring Boot自动配置原理

简介

  1. 首先是通过@SpringBootApplication注解标注启动类启动Springboot应用。
  2. @SpringBootApplication内被@EnableAutoConfiguration标注。
  3. 右@EnableAutoConfiguration注解内的@Import(AutoConfigurationImportSelector.class)加载配置信息。
  4. AutoConfigurationImportSelector.class实现了ImportSelect接口的selectImports()方法,该方法会读取所有路径下的META-INF/spring.factories。
  5. 读取spring.factories完毕后会扫描所有自动配置类,通过spring容器实现自动配置。

出发点@SpringBootApplication

屏幕快照1

@SpringBootApplication注解内部,依赖多个注解,大部分注解都是java的常规注解,看命名就能发现@EnableAutoConfiguration这个注解应该是我们想要的,所以继续看这个注解。

深入@EnableAutoConfiguration

  1. @SpringBootApplication的源码

屏幕快照2

@EnableAutoConfiguration注解被两个注解标注一个是@AutoConfigurationPackage注解,一个是@import一个类:AutoConfigurationImportSelector.class

  1. @EnableAutoConfiguration的源码

屏幕快照3

@AutoConfigurationPackage注解的功能:启动自动配置,该注解开启,使用Spring boot启动项目时,就会把找的jar包,自动配置整合。

  1. AutoConfigurationImportSelector.class的源码

该类一共实现了6个接口

屏幕快照3

第一个接口@DeferredImportSelector,他还继承一个父接口:ImportSelect

屏幕快照 2020-06-11 10.07.27

@ImportSelect主要作用是收集需要导入的配置类,如果该接口的实现类同时实现EnvironmentAware, BeanFactoryAware ,BeanClassLoaderAware或者ResourceLoaderAware,那么在调用其selectImports方法之前先调用上述接口中对应的方法,如果需要在所有的@Configuration处理完在导入时可以实现DeferredImportSelector接口。

4. 实现该接口的方法:selectImports()

屏幕快照 2020-06-11 10.09.17

该方法内部掉用了一个getAutoConfigurationEntry()方法,深入其内部查看源码

屏幕快照 2020-06-11 10.09.56

核心在与获取的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()这个方法,通过该方法加载配置。

  1. SpringFactoriesLoader.loadFactoryNames()方法

核心来了,在该方法中会读取META-INF/spring.factories下的所有内容

classLoader.getResources(“META-INF/spring.factories”) : ClassLoader.getSystemResources(“META-INF/spring.factories”);

屏幕快照 2020-06-11 10.16.37

而每个META-INF/spring.factories则是spring-boot-autoconfiguration这个jar内部的spring.factories,该文件中包含了所有需要自动配置的类

屏幕快照 2020-06-11 10.21.27

屏幕快照 2020-06-11 10.21.51

springboot服务,通过服务入口类的注解,实现自动配置能力,实现的流程时,在启动时,会去扫描resources/META-INF路径下的spring.factories里的自动配置类,从而实现类的自动配置。

最终实现类的自动配置

详情请参考文章XXXX,看如何编写一个自动配置类,并且使用它,对于理解Spring Boot的自动配置更加有帮助。

参考资源

1.配置参照

2.https://www.cnblogs.com/trey/p/10053459.html


文章作者: Bxan
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Bxan !
  目录