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

相关推荐
辰海Coding1 小时前
MiniSpring框架学习-完成的 IoC 容器
java·spring boot·学习·架构
小小编程路1 小时前
C++ 多线程与并发
java·jvm·c++
AI视觉网奇1 小时前
linux 检索库 判断库是否支持
java·linux·服务器
zhangxingchao1 小时前
多 Agent 架构到底怎么选?从 Claude Agent Teams、Cognition/Devin 到工程落地原则
前端·人工智能·后端
IT_陈寒1 小时前
SpringBoot那个自动配置的坑,害我排查到凌晨三点
前端·人工智能·后端
ServBay1 小时前
OpenCode 和它的7款必备插件
后端·github·ai编程
ping某1 小时前
逐字节拆解 tcpdump
后端
阿凡9807301 小时前
花 100 dollar,用 Claude 打通 EasyEDA&Fusion 双向同步
后端·程序员
irving同学462382 小时前
从零搭建生产级 RAG:Embedding、Chunking、Hybrid Search 与 Reranker
前端·后端
她的男孩2 小时前
从零搭一个企业后台,为什么我把能力拆成 Starter 和 Plugin
java·后端·架构