spring是如何解决循环依赖的

造成循环依赖的原因 A依赖B B依赖A,这都知道

1.首先spring在创建一个A对象时,会把这个beanName放到一个Set集合中,在这个集合里的都是正在创建的Bean。

2.通过反射得到一个Bean,把这个bean,beanName,bean的定义,放到三级缓存中。

3.填充属性B。属性会先从单例池中找,找到直接赋值。找不到就会去判断Set集合中是否有这个beanName,此时这个Set中还没有B。所以spring会去创建B。创建B时发现需要一个A属性,同样会在Set集合中找,发现A在Set集合中,此时spring就知道出现了循环依赖的问题。于是去二级缓存earlySingletonObjects里找A的代理对象。找到了也就赋值了并完成B的创建了。但是A当前没有进行AOP还没有代理对象,所以A会提前AOP,需要在三级缓存中获取这个bean,和beanName。然后进行AOP。获得一个不完整的代理对象,再把这个不完整的代理对象放入二级缓存中,然后把三级缓存中的这个bean放到一个叫earlyProxyReferences的Map中。删除三级缓存中的bean,beanName。

4.其他事情

5.判断是否还需要AOP,从earlyProxyReferences这个Map中获取当前的Bean,如果有就说明已经AOP过了。如果没有就要调用postProcessAfterInitialization()方法进行AOP

6.其他事情

7.把Bean放入单例池

8.把当前Bean在Set中移除。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值