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

相关推荐
lisw053 小时前
计算与科学哲学(Philosophy of Computing and Science)
java·开发语言·人工智能
凤山老林3 小时前
Spring Boot 集成 ShardingSphere-Encrypt 实现字段级实时脱敏
java·spring boot·后端·数据脱敏
vipxieliang3 小时前
ValidX v1.2.0 更新日志
java·后端
叫我Paul就好3 小时前
Spring 为何没有在 Java之外的地方存在?
java·后端·spring
xbgRS4 小时前
RocketMQ中的broker
java·rocketmq
晓晓_za8986684 小时前
Geo 优化源码二次开发:自定义地域规则改造实操文档
java·开发语言·搜索引擎·ci/cd·矩阵
摇滚侠4 小时前
《SpringBoot 3:入门与应用实战》第 8 章 AOP 的进阶机制和应用 阅读笔记 16
java·spring boot·笔记
AI人工智能+电脑小能手4 小时前
大白话说Java设计模式-38-迭代器模式(业务实战篇)
java·设计模式·迭代器模式·stream·遍历封装·集合通用·分页遍历
QQ_21696290964 小时前
【源码编号:project86570】SpringBoot电影院在线选座售票系统:电影排片、在线选座、订单购票、后台管理完整实战
java·spring boot·后端
谢亮_vipxieliang5 小时前
手机号验证技术方案:号段规则与正则表达式
java·服务器·spring boot·正则表达式·hibernate