spring源码 循环依赖流程

本文详细阐述了Spring框架处理循环依赖的过程,包括三级缓存的作用。首先介绍了一个A类和B类相互依赖的例子,接着解释了从无参构造到属性注入的八个步骤。Spring通过一级、二级和三级缓存解决循环依赖问题,一级缓存存储完全初始化的bean,二级缓存用于多bean循环依赖,三级缓存存储提前暴露的引用。在构造函数循环依赖的情况下,由于getBean操作发生在三级缓存存储之前,会导致异常。
摘要由CSDN通过智能技术生成

循环依赖整体流程图:

 

循环依赖步骤:

1、A 类无参构造函数实例化后,设置三级缓存

2、A 类 populateBean 进行依赖注入,这里触发了 B 类属性的 getBean 操作

3、B 类无参构造函数实例化后,设置三级缓存

4、B 类 populateBean 进行依赖注入,这里触发了 A 类属性的 getBean 操作

5、A 类之前正在实例化,singletonsCurrentlyInCreation 集合中有已经有这个 A 类了,三级缓存里面也有了,所以这时候是从三级缓存中拿到的提前暴露的A 实例,该实例还没有进行 B 类属性的依赖注入的,B 类属性为空。

6、B 类拿到了 A 的提前暴露实例注入到 A 类属性中了

7、B 类实例化已经完成,B 类的实例化是由 A 类实例化中 B 属性的依赖注入触发的 getBean 操作进行的,现在 B 已经实例化,所以 A 类中 B 属性就可以完成依赖注入了,这时候 A 类 B 属性已经有值了

8、B 类 A 属性指向的就是 A 类实例堆空间,所以这时候 B 类 A 属性也会有值了。

1、什么是bean循环依赖?

在进行getBean的时候,A对象中去依赖B对象,而B对象又依赖A对象,A、B对象都不能完成实例化,出现了循环依赖。就会出现死循环,最终导致内存溢出的错误。代码案例如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值