当前位置: 首页 > news >正文

Spring如何解决循环依赖?

一、Spring的三级缓存

关键就是提前暴露未完全创建完毕的Bean。
三级缓存来解决循环依赖:
一级缓存:用于存储完全初始化完成的单例Bean。
二级缓存:用于存储尚未完全初始化,但已实例化的Bean,用于提前暴露对象,避免循环依赖问题。
三级缓存:用于存储对象工厂,当需要时,可以通过工厂创建早期Bean(特别是为了支持AOP代理对象的创建)

二、Spring解决循环依赖流程

解决步骤:
1、Spring首先创建Bean实例,并将其加入三级缓存中(Factory);
2、当一个Bean依赖另一个未初始化的Bean时,Spring会从三级缓存中获取Bean的工厂,并生成Bean的代理对象;
3、代理对象存储二级缓存,解决循环依赖;
4、一旦所有依赖Bean被完全初始化,Bean将转移到一级缓存中。

三、Spring解决循环依赖流程(案例版)

带入案例,解决Spring的三级缓存解决循环依赖问题:
假设:A、B之间是两个循环依赖
1、一开始创造A的时候查询一级缓存(里面存成品),发现没找到则看二级缓存是否在创建中(有没有半成品)。都没有则需要创建A的bean,调用的是createBean。过程分别是实例化、属性注入、初始化。
2、A实例化之后往三级缓存加入一个A的getObject方法,这个就是解决循环依赖的关键。
3、到了属性注入,因为A依赖B因此需要创建B。同样的路线B也要createBean。不一样的也是解决循环依赖的一环:到了属性注入,查询二级缓存的A为创建中,则调用三级缓存的工厂getObject创建一个半成品的A,放入到二级缓存中,并完成B的第二步属性注入。
4、后面初始化initializeBean,完成B的Bean创建,放到一级缓存。
5、回到A刚刚卡在的属性注入,现在可以成功注入B,然后初始化,A也就完成了Bean创建。
(注:成品和半成品就是没有注入所需的依赖)

相关文章:

  • CCF-CSP历年真题大全附题解python
  • 矩阵的奇异值(SVD)分解和线性变换
  • DeepSeek推出DeepEP:首个开源EP通信库,让MoE模型训练与推理起飞!
  • FastJSON 默认行为:JSON.toJSONString 忽略 null 字段
  • python 使用 venv 创建虚拟环境 (VSCode)
  • 关于命令行下的 git( git add、git commit、git push)
  • 字符串_替换数字
  • 蓝桥每日打卡
  • HBase与MapReduce结合(一)——HBase表中插入数据
  • Ubuntu 下 nginx-1.24.0 源码分析 - pool->cleanup
  • 半导体制造工艺(二)光刻工艺—掩模版
  • SpringAI从人工智障到人工智能的实战改造
  • 人工智能时代:Python学习的全面攻略路线图
  • 二分法 ──── 算法3
  • JAVA实战开源项目:靓车汽车销售网站(Vue+SpringBoot) 附源码
  • 安装floodlight
  • unity学习54:图片+精灵+遮罩mask,旧版文本 text 和新的TMP文本
  • vi编辑器的使用(内附快捷键的使用)(超详细)
  • 图扑数字孪生:解锁压缩空气储能管控新高度
  • elementplus点击按钮直接预览图片
  • 民生访谈|规范放生活动、提升供水品质……上海将有这些举措
  • 阿里开源首个“混合推理模型”:集成“快思考”、“慢思考”能力
  • 澎湃回声|山东莱州、潍坊对“三无”拖拉机产销市场展开调查排查
  • 金融街:去年净亏损约110亿元,今年努力实现经营稳健和财务安全
  • 太好玩了!坐进大卫·霍克尼的敞篷车进入他画笔下的四季
  • 十四届全国人大常委会举行第四十三次委员长会议 ,听取有关草案和议案审议情况汇报