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

Spring如何解决循环依赖?

Spring中的循环引用

循环依赖:循环依赖其实就是循环引用,也就是两个或两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于A
循环依赖在spring中是允许存在,spring框架依据三级缓存已经解决了大部分的循环依赖
  • ①一级缓存:单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象
  • ②二级缓存:缓存早期的bean对象(生命周期还没走完)
  • ③三级缓存:缓存的是ObjectFactory,表示对象工厂,用来创建某个对象的

解决流程

  • 第一,先实例A对象,同时会创建ObjectFactory对象存入三级缓存singletonFactories
  • 第二,A在初始化的时候需要B对象,这个走B的创建的逻辑
  • 第三,B实例化完成,也会创建ObjectFactory对象存入三级缓存singletonFactories
  • 第四,B需要注入A,通过三级缓存中获取ObjectFactory来生成一个A的对象同时存入二级缓存,这个是有两种情况,一个是可能是A的普通对象,另外一个是A的代理对象,都可以让ObjectFactory来生产对应的对象,这也是三级缓存的关键
  • 第五,B通过从通过二级缓存earlySingletonObjects 获得到A的对象后可以正常注入,B创建成功,存入一级缓存singletonObjects
  • 第六,回到A对象初始化,因为B对象已经创建完成,则可以直接注入B,A创建成功存入一次缓存singletonObjects
  • 第七,二级缓存中的临时对象A清除

构造方法出现了循环依赖

由于bean的生命周期中构造函数是第一个执行的,spring框架并不能解决构造函数的的依赖注入,可以使用@Lazy懒加载,什么时候需要对象再进行bean对象的创建

相关文章:

  • macOS 通过 MacPorts 正确安装 MySQL 同时解决无法连接问题
  • postgresql查看数据库占用空间大小
  • 《如何使用C语言去下三子棋?》
  • qt+ffmpeg 实现音视频播放(二)之音频播放
  • 【UE5】动画蒙太奇简述
  • K8S日志收集方案-EFK部署
  • 第五篇:数字视频广告格式概述 - IAB视频广告标准《数字视频和有线电视广告格式指南》
  • 流畅的 Python 第二版(GPT 重译)(六)
  • 如何与手机共享笔记本电脑的互联网?这里提供详细步骤
  • 回归预测 | Matlab基于SAO-BiLSTM雪融算法优化双向长短期记忆神经网络的数据多输入单输出回归预测
  • k8s client-java创建pod常见问题
  • C++面试宝典第36题:骑士游历
  • 【云原生进阶之数据库技术】第二章-Oracle-运维-2.2-数据库卸载
  • win7、win10、win11 系统能安装的.net framework 版本以
  • Vue3、element-plus和Vue2、elementUI的一些转换
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 4. 路由到控制器 - Laravel从零开始教程
  • Codepen 每日精选(2018-3-25)
  • CSS3 变换
  • magento 货币换算
  • Netty源码解析1-Buffer
  • php中curl和soap方式请求服务超时问题
  • Redis字符串类型内部编码剖析
  • session共享问题解决方案
  • 闭包--闭包之tab栏切换(四)
  • 初探 Vue 生命周期和钩子函数
  • 基于 Babel 的 npm 包最小化设置
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 技术发展面试
  • 类orAPI - 收藏集 - 掘金
  • 那些被忽略的 JavaScript 数组方法细节
  • 前端_面试
  • 前端面试之CSS3新特性
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 入口文件开始,分析Vue源码实现
  • 使用API自动生成工具优化前端工作流
  • 使用Gradle第一次构建Java程序
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 用简单代码看卷积组块发展
  • 在Unity中实现一个简单的消息管理器
  • 你对linux中grep命令知道多少?
  • 容器镜像
  • ​比特币大跌的 2 个原因
  • #include<初见C语言之指针(5)>
  • #QT(TCP网络编程-服务端)
  • (2.2w字)前端单元测试之Jest详解篇
  • (4)logging(日志模块)
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (图)IntelliTrace Tools 跟踪云端程序
  • (转)IOS中获取各种文件的目录路径的方法
  • .Net MVC4 上传大文件,并保存表单
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET开发不可不知、不可不用的辅助类(一)
  • .NET设计模式(11):组合模式(Composite Pattern)