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也可以创建完成,也可以入驻一级缓存。

相关推荐
2501_9481201516 小时前
Java实现的SSL/TLS协议通信系统
java·开发语言·ssl
b20772116 小时前
Flutter for OpenHarmony 身体健康状况记录App实战 - 个人中心实现
android·java·python·flutter·harmonyos
带刺的坐椅16 小时前
Claude Code Agent Skills vs. Solon AI Skills:从工具增强到框架规范的深度对齐
java·ai·agent·claude·solon·mcp·skills
⑩-16 小时前
JUC-场景题
java·开发语言
源代码•宸16 小时前
Leetcode—47. 全排列 II【中等】
经验分享·后端·算法·leetcode·面试·golang·深度优先
Wyy_9527*16 小时前
行为型设计模式——状态模式
java·spring boot·后端
a程序小傲16 小时前
京东Java面试被问:基于Gossip协议的最终一致性实现和收敛时间
java·开发语言·前端·数据库·python·面试·状态模式
组合缺一16 小时前
MCP 进化:让静态 Tool 进化为具备“上下文感知”的远程 Skills
java·ai·llm·agent·mcp·skills
程序员小白条16 小时前
面试 Java 基础八股文十问十答第二十二期
java·开发语言·数据库·面试·职场和发展·毕设
taihexuelang17 小时前
jenkins 部署java项目
java·servlet·jenkins