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

spring 如何解决循环依赖

Spring 中使用了三级缓存的设计,来解决单例模式下的属性循环依赖问题。

解决的只是单例模式下 setter 方法注入bean属性循环依赖问题,

对于多例 Bean 和 构造方法注入 参数的循环依赖问题,并不能使用三级缓存设计解决。

缓存变化过程

  1. A实例化后、注入前放到3级缓存
  2.  A在注入属性时,发现有循环依赖,因此需要先getBean(B),实例化B,并将B也 从入3级缓存
  3. B放到3级缓存后,这时B要开始注入属性A,于是B找到了循环依赖A后,再从头执行getBean(A)方 法,getSingleton方法本次从缓存中取,然后将A设置到2级缓存,并且从3级缓存移除。
  4. B如愿以偿的拿到了A完成注入,然后B执行到DefaultSingletonBeanRegistry#addSingleton方 法,将B从3级缓存移出,放入1级缓存,到此B完成。B的完成是被动的,A需要它,才会先去创建 它
  5. A 还要继续自己的流程,然后populateBean方法将B注入。然后,A移出2级缓存,进入1级缓存, 整个流程完成! 

 为什么不能解决非单例、构造方法的循环依赖问题

为什么不能解决构造方法的循环依赖?

        创建对象会走构造方法,而构造方法的参数是互相依赖的对象,此时都还没有初始化创建完成,因此无法进行实例化创建

为什么不能解决多例的循环依赖?

        IoC容器只会管理单例Bean,并将单例Bean存入缓存。作用域为prototype时,每次getBean 都会创建新的对象,并不存入缓存,因此不可以解决循环依赖问题。

 解决方法

避免循环依赖:

引入第三个类C, A 和 B 都依赖 C, 而不是相互依赖

 


http://www.kler.cn/a/354892.html

相关文章:

  • Go快速开发框架2.6.0版本更新内容快速了解
  • 机器学习之KNN算法预测数据和数据可视化
  • linux RCU调优
  • RK3506开发板:智能硬件领域的新选择,带来卓越性能与低功耗
  • SOTA简繁中文拼写检查工具:FASPell Chinese Spell Checker 论文
  • linux安装字体(亲测)
  • 《米小圈动画成语》|在趣味中学习,在快乐中掌握成语知识!
  • C++11新特性(4)
  • 5、JavaScript(二)
  • java面试-每日随机(1014)
  • 接口测试常用工具及测试方法
  • Android 第5种启动模式:singleInstancePerTask
  • Leetcode 单词规律
  • 15分钟学Go 实战项目一:命令行工具
  • JavaWeb合集02-Vue基础内容
  • 虚拟化桌面
  • Parasoft C/C++test CT 荣获TÜV SÜD认证,在安全关键应用开发与验证方面达到最佳实践标准
  • 空间解析几何 3:空间点到线段和平面的距离【附MATLAB代码】
  • 面对专利档案管理难题,我们该怎么办?
  • 用Java爬虫API,轻松获取电商商品SKU信息
  • 怎么在地图导航上添加自己的店面定位?
  • Centos7默认的python版本是2.7,现在很多新开发的python均需要3.X以上。下面升级centos的预装python版本到最新。
  • Python123练习题
  • Python网络爬虫:分析淘宝商品热度与销量[进阶深度优化]
  • 查看SQL执行计划 explain
  • learn C++ NO.26——哈希应用