Spring是怎么解决循环依赖的?

Spring是通过三级缓存机制来解决循环依赖的。

我们可以把这三级缓存想象成3个不同等级的"货架":

其中,一级缓存存放的是成品货架,这里面都是完全初始化好,并且可以直接使用的Bean。

二级缓存存放的是半成品货架,这里面都是已经实例化好的,但是呢,还没有填充属性的Bean。

三级缓存存放的是工厂货架,这里放的就不是Bean了,而是一个可以生产Bean的工厂。

我们来理一下三级缓存解决循环依赖的流程:

假设A和B是相互依赖的,

首先,Spring先把A实例化出来,此时A还只是一个空壳,紧接着把一个可以获取A的工厂放到三级缓存里。

然后,A开始填充属性,这时发现需要B,所以就跑去创建B。

这时,B也实例化出来了,也开始填充属性,发现需要A。

然后,B就去一级缓存中寻找A,但是呢,没找到;所以又去二级缓存中寻找,也没找到;再跑去三级缓存中寻找,这下找到了。

这时,B就调用三级缓存中的工厂,拿到了A的引用。

为了保证是单例,只生产一次,B就把拿到的A放到二级缓存中,并把三级缓存中的工厂删掉。

B拿到了A后,B就创建完成了,入驻一级缓存。

A拿到B之后,A也可以创建完成,也可以入驻一级缓存。

相关推荐
知守观几秒前
多模块架构演进:横向分层 vs 纵向领域,13 个真实项目的切分对照
java·后端·微服务
Java成神之路-16 分钟前
Java String 为什么不可变?和 HashMap 到底有什么关系?
java
paopaokaka_luck19 分钟前
基于springboot+vue的益暖微光公益服务平台(DeepSeek公益助手、善款信息追溯、志愿服务积分闭环、ECharts运营分析、活动状态自动流转)
java·前端·javascript·spring boot·mysql·架构·echarts
文丑颜不良啊30 分钟前
LeetCode1401~1420题目解析
java·leetcode
Nuanyt31 分钟前
LeetCode Hot 100 链表专题2 3 题 (Java)
java·笔记·算法·leetcode·链表
文丑颜不良啊39 分钟前
LeetCode1341~1360题目解析
java·leetcode
系统集成-鹰翔1 小时前
ERP推单数据库怎么备份:SQLite WAL模式下只复制db文件为什么可能漏任务
javascript·数据库·经验分享·后端
QianhangQianping1 小时前
撤销重做不是「存快照」:一个可视化编辑器的Operation 设计
java·前端·数据库·typescript·编辑器·前端架构·撤销重做
海绵宝宝转agent1 小时前
LeetCodehot100题解
java·笔记·学习·算法·leetcode·深度优先
SunnyDays10111 小时前
Java 操作 Word 脚注和尾注:添加、读取与删除
java·word