自动装配原理
SpringBoot的核心就是四个字: 自动装配
所以面试会有一个问题:讲讲SpringBoot自动装配的原理?
SpringBoot版本:3.2.5,
tips:2.x.x版本的SpringBoot,其自动配置资源文件的地址会有区别,但是大体逻辑是一致的
自动装配的核心逻辑链条:
@SpringBootApplication
注解 包含 @EnableAutoConfiguration
@EnableAutoConfiguration
注解 包含 @Import({AutoConfigurationImportSelector.class})
导入AutoConfigurationImportSelector
类
AutoConfigurationImportSelector
类实现DeferredImportSelector
接口,DeferredImportSelector
接口继承自ImportSelector
接口,ImportSelector
接口有selectImports()
方法
AutoConfigurationImportSelector
实现selectImports()
方法
selectImports()
有getAutoConfigurationEntry()
获取候选的自动配置项,并进行处理
我们重点关注getCandidateConfigurations()
,因为其是获取所有候选配置,getAutoConfigurationEntry()
后续的大部分逻辑都是对其返回的配置进行筛选处理。
getCandidateConfigurations()
通过ImportCandidates
类的静态方法load()
完成候选自动配置项的导入
ImportCandidates
类的静态方法load()
拼接出自动配置的资源文件地址,
getCandidateConfigurations()
中传给load()
的注解是AutoConfiguration.class
所以拼接的结果会是"org.springframework.boot.autoconfigure.AutoConfiguration.imports"
也就是类路径下的所有META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件(是的,这个文件有很多,比如Mybatis-Plus有,SpringBoot本身自己也有)
具体的某份AutoConfiguration.imports文件,格式都类似,比如:
ImportCandidates
类的静态方法load()
拿到自动配置资源文件里写的这些URL
,将这些URL
放到一个枚举集合中,后续遍历这个枚举集合,通过readCandidateConfigurations()
传入url
进行处理。这个url
,也就是路径下的所有META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件其中的某个的路径(是的,这个文件有很多,比如Mybatis-Plus有,SpringBoot本身自己也有)。
readCandidateConfigurations()
的读取资源文件的每行内容,其中每一行都是某个类的全限定名
遍历完所有的自动配置资源文件,也就把所有自动配置资源文件下的所有包含的类的全限定名加入到了自动配置项中,后续逐层返回给AutoConfigurationImportSelector
类的getCandidateConfigurations()
方法,完成后续的筛选逻辑。
后续Spring会把这里的selectImports()
返回要导入的全限定类名数组中的类主动注册为Bean,从而完成整个自动配置的流程。
参考
- 狂神说 SpringBoot 学习笔记:https://blog.csdn.net/qq_47540091/article/details/124384771
- 尚硅谷SpringBoot2零基础入门教程:https://www.bilibili.com/video/BV19K4y1L7MT/?share_source=copy_web&vd_source=5f965d19d1880efe7da6e4e78abbaa30)
- JavaGuide SpringBoot自动配置原理https://javaguide.cn/system-design/framework/spring/spring-boot-auto-assembly-principles.html