spring通过三级缓存解决循环依赖

Spring 通过 三级缓存 + 提前暴露早期引用 的机制来解决循环依赖,但仅支持单例作用域且通过Setter/字段注入的Bean

Spring只支持单例作用域 + Setter/字段注入的循环依赖,原因有三:

  1. 三级缓存机制需要提前暴露对象 → 只能单例
  2. 构造器注入需要完整的对象 → 无法提前暴露
  3. 原型作用域不缓存 → 无法复用早期引用

三级缓存指:

  • 一级缓存(singletonObjects):存放完全初始化好的单例Bean
  • 二级缓存(earlySingletonObjects):存放提前暴露的、未完全初始化的Bean原始对象
  • 三级缓存(singletonFactories):存放Bean的ObjectFactory,用于生成代理对象

解决流程(以A依赖B,B依赖A为例)

实例化A:创建A的原始对象,将A的对象工厂放入三级缓存

填充A的属性B:发现需要B,从各级缓存获取B都失败,去创建B

实例化B:创建B的原始对象,将B的对象工厂放入三级缓存

填充B的属性A:此时从三级缓存获取A的对象工厂成功,调用getEarlyBeanReference获得A的早期引用(可能是代理对象)放入二级缓存,注入给B

B完成初始化:将B放入一级缓存,删除三级缓存中的B对象工厂

返回A继续初始化:A拿到B的引用,完成自身初始化,放入一级缓存,删除二、三级缓存中的A

相关推荐
SL_staff1 小时前
别急着买商业规则引擎:90%风控场景根本不需要全量编码能力
java·程序员·groovy
ManageEngineITSM1 小时前
DevOps和ITIL是什么关系?是替代还是互补一文讲清
java·服务器·资产管理·变更管理
SL_staff2 小时前
ERP排程总在纸上谈兵?JVS-APS如何用真实产能约束打通计划与执行闭环
java·人工智能·开源
xcl09252 小时前
24小时自助健身房系统软件开发实战指南:从架构到部署
java·spring boot
码少女3 小时前
Linux--多路转接之select
java·服务器·数据库
nvvas3 小时前
Java 入门(四):数组——数据的集合管理
java·开发语言
吉甫作诵3 小时前
Redis 常用命令大全:11 大类命令速查手册
运维·数据库·redis·缓存·nosql
Lambert2814 小时前
AgentScope Java 从零(07):官方有权限引擎,我却在工具里写了个 if
java·后端·ai编程
Kyrie_kk4 小时前
Java--ThreadLocal线程副本(一)
java·后端
hweiyu004 小时前
Redis命令:MGET
redis·缓存