SpringBoot自动配置原理解析 | Java后端 SpringBoot

41 阅读2分钟

SpringBoot自动配置原理

源码分析 ==>

  1. 首先进入@SpringBootApplication

该注解为一个组合注解,我们可以看到有以下两个注解:p1.png

  1. @SpringBootConfiguration注解: 表示该注解是一个配置类注解。
  2. @EnableAutoConfiguration注解:该注解为自动配置的核心注解,搭载了这个注解后,SpringBoot会自动配置一些Bean注入到IOC容器中。
  1. 我们再进入@EnableAutoConfiguration p2.png

该注解同样为组合注解,包含以下两个注解:

  1. @AutoConfigurationPackage注解:该注解包含了自动配置的包

  2. @Import(AutoConfigurationImportSelector.class): 该注解导入了ImportSelector的一个实现类,其重写了一个String[] selectImports(...)方法, 它通过层层的调用,最终会读取到spring-boot-autoconfigure/MATA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports这个配置文件,在该配置文件中 写了一堆全类名,这些类都是自动配置类。

调用过程: String[] selectImports(...) p3.pngAutoConfigurationEntry getAutoConfigurationEntry(...) p4.png List<String> getCandidateConfigurations(...)

 protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
 List<String> configurations = ImportCandidates.load(AutoConfiguration.class, this.getBeanClassLoader()).getCandidates();
 Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you are using a custom packaging, make sure that file is correct.");
 return configurations;
 }

从上面代码可以观察得到,如果configurations为空,则会报错No auto configuration classes found in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports.,这一步很重要,它告诉我们,自动配置的类是从这个imports文件里拿到的,所以我们查找这个文件,它的具体位置在我们maven导入的spring-boot-starter里面。 p5.png 我们可以发现有一个叫做spring-boot-autoconfigure的依赖,在项目库中找到这个依赖。 p6.png 我们发现了在上述代码段中提到的imports文件,这个文件存有一些全类名,其内部都是一些自动注入的配置类的类名。 p7.png 其中包含web中的核心类DispatcherServlet的自动注入配置类,我们进入这个自动配置类可以看到源码如下: ! p8.png该自动配置类包含两个注解:

  1. @AutoConfiguration:该注解表示这个类为自动配置类。

  2. @ConditionnalOnClass(DispatcherServlet.class):该注解表示只有在当前环境中存在DispatcherServlet这个类,这个自动配置才会生效,否则不生效

经过了以上这个探究代码的过程,SpringBoot就实现了一个功能,只有当我们引入了SpringBoot的web依赖,也就是当前环境中存在DispatcherServlet这个类,SpringBoot就会帮我们在容器中自动注入一个DispatcherServlet的实例。自动注入的核心代码如下: p9.png注意!在SpringBoot 2.7之前自动配置的类名是存放在spring.factories文件内的,在2.7~3.0版本的时候,SpringBoot同时支持.imports和.factories文件,在3.0版本之后,SpringBoot仅支持.imports文件

面试回答SpringBoot自动配置原理: p10.png