Spring循环依赖

学习链接

https://www.yuque.com/renyong-jmovm/kb/dpzl6u

bean的生命周期

在这里插入图片描述

循环依赖实例

在这里插入图片描述

同样的B中有对A的依赖

循环依赖与生命周期

在这里插入图片描述

解决循环依赖的过程:三级缓存

B先取原始对象放进去,完成自己的初始化就打破了循环依赖
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

AOP存入单例池的对象不是new 出来的原始对象,而是经过代理的对象

由上,加一个缓存是不能彻底解决循环依赖的
所以说要有一个单例池,这就是二级缓存

这种就是没有手动注入到第三级缓存而导致循环依赖问题无法彻底解决

一级缓存是最终的单例池

二级缓存:提早生成的单例池
在这里插入图片描述
在这里插入图片描述

为什么要三级缓存ObjectFactory:存的是lambda表达式,也可以说是工厂,只有在产生循环依赖的时候才会去执行存入的工厂,直接生成代理对象
如果判断没有循环依赖也没有AOP,不会出现AOP引起的循环依赖问题,即最终存入的是代理对象而不是初始对象
就不需要执行三级缓存的lambda表达式,这时候的结果就是初始的对象
需要三级缓存的原因:保证只执行一次,防止反复执行工厂表达式。即在B的过程中判断后直接移除表达式,或者执行或者不执行但是一定要取出。因此保证执行一次

二级缓存:
A依赖B,B判断A需要经过AOP,取三级缓存的lambda表达式,生成A的提早暴露版本并放入二级缓存中
后续A再生成最终的资源时,直接取二级缓存结果,进行剩余的属性填充后最终进入一级缓存即可

二级与三级都是在解决循环依赖的时候用到的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring循环依赖指的是在Spring中,多个Bean之间存在相互依赖的情况。具体来说,当一个Bean A依赖于另一个Bean B,同时Bean B也依赖于Bean A时,就形成了循环依赖。这种情况下,Spring需要解决Bean的创建和依赖注入的顺序问题。 在Spring中,循环依赖问题是由于Bean的生命周期所引起的。Spring的Bean生命周期包括了Bean的实例化、属性注入、初始化以及销毁等过程。当出现循环依赖时,Spring会通过使用“提前暴露”的方式来解决这个问题。 具体来说,当Spring创建Bean A时,发现它依赖于Bean B,于是会创建一个A的半成品对象,并将其暂时放入一个缓存中。然后,Spring会继续创建Bean B,并将其注入到A的属性中。接着,Spring会继续完成B的创建,并将其放入缓存中。最后,Spring会将A的半成品对象交给B进行依赖注入,完成A的创建,并将其从缓存中移除。 需要注意的是,Spring循环依赖有一定的限制条件。例如,如果Bean A和Bean B都是单例模式,那么它们之间的循环依赖是无法解决的。因为单例模式下,Bean的创建和依赖注入是同时进行的,无法通过缓存来解决循环依赖。在这种情况下,程序员需要手动调整Bean的依赖关系或使用其他解决方案来避免循环依赖的问题。 综上所述,Spring循环依赖是指在Spring中多个Bean之间存在相互依赖的情况。Spring通过使用缓存和提前暴露的方式来解决循环依赖问题,但在某些情况下有一定的限制条件需要注意。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值