SpringBoot自动配置原理
源码分析 ==>
首先进入
@SpringBootApplication
该注解为一个组合注解,我们可以看到有以下两个注解:
- @SpringBootConfiguration注解: 表示该注解是一个配置类注解。
- @EnableAutoConfiguration注解:该注解为自动配置的核心注解,搭载了这个注解后,SpringBoot会自动配置一些Bean注入到IOC容器中。
我们再进入
@EnableAutoConfiguration
该注解同样为组合注解,包含以下两个注解:
@AutoConfigurationPackage注解:该注解包含了自动配置的包
@Import(AutoConfigurationImportSelector.class): 该注解导入了
ImportSelector
的一个实现类,其重写了一个String[] selectImports(...)
方法, 它通过层层的调用,最终会读取到spring-boot-autoconfigure/MATA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
这个配置文件,在该配置文件中 写了一堆全类名,这些类都是自动配置类。调用过程:
String[] selectImports(...)
AutoConfigurationEntry getAutoConfigurationEntry(...)
![]()
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里面。我们可以发现有一个叫做spring-boot-autoconfigure的依赖,在项目库中找到这个依赖。
我们发现了在上述代码段中提到的imports文件,这个文件存有一些全类名,其内部都是一些自动注入的配置类的类名。
其中包含web中的核心类DispatcherServlet的自动注入配置类,我们进入这个自动配置类可以看到源码如下: !
该自动配置类包含两个注解:
@AutoConfiguration
:该注解表示这个类为自动配置类。
@ConditionnalOnClass(DispatcherServlet.class)
:该注解表示只有在当前环境中存在DispatcherServlet
这个类,这个自动配置才会生效,否则不生效经过了以上这个探究代码的过程,SpringBoot就实现了一个功能,只有当我们引入了SpringBoot的web依赖,也就是当前环境中存在
DispatcherServlet
这个类,SpringBoot就会帮我们在容器中自动注入一个DispatcherServlet
的实例。自动注入的核心代码如下:注意!在SpringBoot 2.7之前自动配置的类名是存放在spring.factories文件内的,在2.7~3.0版本的时候,SpringBoot同时支持.imports和.factories文件,在3.0版本之后,SpringBoot仅支持.imports文件
面试回答SpringBoot自动配置原理: