spring如何解决循环依赖?

如何解决循环依赖

使用三级缓存
  • singletonObjects
  • earlySingletonObjects
  • singletonFactories
具体流程

A类依赖B B又依赖A (A->B->A)
代码入口可以看spring源码getBean方法,大致流程

  • 首先假设进行实例化A对象
  • 会从一级缓存判断A是否存在,不存在就会进行A的实例化即createBean
  • 创建A对象之间会先打个标记标记A正在创建中
  • 然后开始创建A会判断A是不是单例,是否允许提前暴露,是否在创建中,全部为true,就会吧A放到三级缓存singletonFactoriessingletonFactories
  • 下面会进行属性赋值和依赖注入,这时候假设要注入B,B也会走一遍A的上面的流程。
  • 不同的是当B发现需要注入A的时候,会从1级缓存中获取A
  • 没有获取到,就判断A是不是还在创建中,是的话就会从2级缓存中获取A,获取不到就从3级缓存中获取。(上面也说了A已经在三级缓存中了,这时候的A是一个不完整的bean,但是不耽误用)
  • 获取之后就吧A放进2级缓存,并从三级缓存移除。
  • B这时候能正常的注入A,他的初始化是没问题的。成功之后就会把B放进1级缓存
  • 这时候在回到A的初始化流程中,A就能获取到一个初始化完整的B了
  • A完成了初始化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值