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

Spring框架如何解决循环依赖

目录

  • 一,什么是循环依赖
  • 二、什么是三级缓存
  • 三、Spring框架如何解决循环依赖

一,什么是循环依赖

例:类与类之间的依赖关系形成了闭环,例如A依赖了B,B依赖了C,C又依赖了A。

二、什么是三级缓存

在 Spring 框架中,三级缓存是解决循环依赖问题的核心机制,这三级缓存本质上是三个不同作用的 Map 集合,用于存储 bean 的不同状态

  • 一级缓存(singletonObjects):存储完全初始化完成的单例 Bean(即经过实例化、属性注入、初始化方法执行后的最终成品)
    时机:当 bean 完全初始化后,会从二级缓存或三级缓存移至此缓存
  • 二级缓存(earlySingletonObjects):存储半成品 Bean(已实例化,但未完成属性注入、初始化)
    注意:此缓存中的 bean 是 “半成品”,仅能被其他 bean 引用,自身还需继续完成初始化流程。
  • 三级缓存(singletonFactories):存储 Bean 的工厂(ObjectFactory),用于 “按需创建” 半成品 Bean。当其他 Bean 首次需要引用当前 Bean 时,通过工厂生成 Bean 的早期引用(可能是原始对象或 AOP 代理对象)。

三、Spring框架如何解决循环依赖

A类依赖B类,B类依赖A类咋样解决?

我的思路:

首先创建A的时候创建一个A类工厂存入三级缓存中,然后注入B时,B还没创建,所以去创建B,先创建一个B类工存到三级缓存中,然后B又依赖A,从三级缓存中拿到A的工厂创建A的半成品,放到二级缓存中,并从三级缓存移除,B此时就可以注入A,B完成创建并放到一级缓存中,A此时也可以注入了B,A完成了创建也放到一级缓存中,并从二级缓存移除A。

注意:三级缓存中存放的工厂可以处理 AOP 代理场景,确保 B 依赖的 A 和最终生成的 A 是同一个对象(可能是代理对象),代理对象可以在AOP增强方法时使用。

A类依赖B类,B类依赖C类,C类又依赖了A咋样解决?
我的思路:
1.创建 A:
Spring 创建 A 时,将 A 的工厂对象存入三级缓存,此时 A 是 “半成品”(未完成属性注入)。
A 需要依赖 B,Spring 转而开始创建 B。
2.创建 B:
实例化 B 后,将 B 的工厂存入三级缓存。
B 需要依赖 C,Spring 转而开始创建 C。
3.创建 C:
实例化 C 后,将 C 的工厂存入三级缓存。
C 需要依赖 A,此时 Spring 尝试获取 A:
从三级缓存中获取 A 的工厂,通过工厂生成 A 的早期引用(可能是原始对象或代理对象),并将 A 移至二级缓存,同时删除三级缓存中的 A 工厂。
C 成功注入 A,完成属性注入和初始化,最终 C 被存入一级缓存。
4.继续创建 B:
B 依赖的 C 已存在于一级缓存,B 注入 C 后完成初始化,存入一级缓存。
5.继续创建 A:
A 依赖的 B 已存在于一级缓存,A 注入 B 后完成初始化,A从早期的二级缓存移除,并放到一级缓存中。
注意:无论循环依赖的链条多长,只要是单例 Bean 且使用 setter 注入,Spring 都能通过这种三级缓存的协作机制来解决,核心是通过提前暴露对象引用并合理管理不同状态的 Bean 缓存。

http://www.dtcms.com/a/327624.html

相关文章:

  • C++11语法(2)
  • Flink Redis维表:Broadcast Join与Lookup Join对比及SQL示例
  • 正则表达式解析(二)
  • pdftk - macOS 上安装使用
  • 【读代码】深度解析 Researcher:开源自动化科研助手
  • 企业级AI大模型后端基础设施管理:从理论到实践的全链路指南
  • 5 重复匹配
  • WPS文字和Word:不只是表格,段落也可以排序
  • gpt-5与gpt-5-fast
  • 【新模型速递】PAI-Model Gallery云上一键部署gpt-oss系列模型
  • 一起来聊聊GPT-5
  • c++的四种类型转换(static_cast,reinterpret_cast,const_cast,dynamic_cast)详解和代码示例
  • 使用pyqt5实现可勾选的测试用例界面
  • B站 韩顺平 笔记 (Day 16)
  • 如何以开发者的身份开发出比python更好的应用软件?
  • 攻击者将Linux摄像头武器化为攻击工具,可注入击键并发动攻击
  • 使用reqwest+select实现简单网页爬虫
  • 《Fast Automatic White Balancing Method by Color Histogram Stretching》论文笔记
  • 小米宠物空气净化器好用吗?希喂/小米/范罗士核心性能深度对比
  • 5G专网项目外场常见业务测试指南(六)-PingInfoView
  • 力扣面试150(54/150)
  • 如何构建PHP表单页面及验证相关原理(PHP基础)
  • 六十、【Linux系统lvs应用】LVS简介 、 LVS-NAT集群 、 LVS-DR集群
  • 微服务ETCD服务注册和发现
  • 3 Abp 核心框架(Core Framework)
  • 过程设计工具深度解析-软件工程之详细设计(补充篇)
  • 数字孪生如何推动智慧园区精细化管理
  • CV 医学影像分类、分割、目标检测,之【皮肤病分类】项目拆解
  • OHEM (在线难例挖掘) 详细讲解
  • 【Vue.js】生产设备规划工具(报价单Word文档生成)【开发全流程】