一篇文章弄懂SpringBoot的自动装配原理

自动装配原理

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()方法

image-20241010124232185

selectImports()getAutoConfigurationEntry()获取候选的自动配置项,并进行处理

image-20241010124829568

我们重点关注getCandidateConfigurations(),因为其是获取所有候选配置,getAutoConfigurationEntry()后续的大部分逻辑都是对其返回的配置进行筛选处理。

getCandidateConfigurations()通过ImportCandidates类的静态方法load()完成候选自动配置项的导入

image-20241010125026750

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()的读取资源文件的每行内容,其中每一行都是某个类的全限定名

image-20241010130911919

遍历完所有的自动配置资源文件,也就把所有自动配置资源文件下的所有包含的类的全限定名加入到了自动配置项中,后续逐层返回给AutoConfigurationImportSelector类的getCandidateConfigurations()方法,完成后续的筛选逻辑。

后续Spring会把这里的selectImports()返回要导入的全限定类名数组中的类主动注册为Bean,从而完成整个自动配置的流程。

参考

  1. 狂神说 SpringBoot 学习笔记:https://blog.csdn.net/qq_47540091/article/details/124384771
  2. 尚硅谷SpringBoot2零基础入门教程:https://www.bilibili.com/video/BV19K4y1L7MT/?share_source=copy_web&vd_source=5f965d19d1880efe7da6e4e78abbaa30)
  3. JavaGuide SpringBoot自动配置原理https://javaguide.cn/system-design/framework/spring/spring-boot-auto-assembly-principles.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值