Spring如何解决循环依赖

Spring容器中的循环依赖分为构造器循环依赖和setter循环依赖。

名词解释:

构造器循环依赖:表示通过构造器注入构成的循环依赖

setter循环依赖:表示通过setter注入方式构成的循环依赖。

作用域:单例作用域或者原型作用域,单例的话需要全局实例化一次,原型每次创建都需要重新实例化。

循环依赖:循环依赖就是循环引用,即两个或多个bean相互之间的持有对方。例如A引用B,B引用C, C引用D。这样它们最终引用成一个环。(注意:循环引用 不是循环调用,循环调用是方法之间的调用成环。且循环调用是无法解决的,除非有终止条件,否则就是死循环,最终导致内存溢出)

简述解决方案:

对于构造器循环依赖是无法解决的,只能抛出BeanCurrentlyInCreationException异常表示循环依赖;Spring容器将每个正在创建的bean标识符放在一个“当前创建bean池”中,bean标识符在创建过程中将一直保持在这个池子里,因此如果在创建bean过程中发现当前bean已经在“当前创建bean池”里面时,将抛出BeanCurrentlyInCreationException异常表示循环依赖;而对于创建完毕的bean将从“当前创建bean池”中移除。

对于setter注入造成的依赖,是通过Spring容器提前暴露刚完成构造器注入但未完成其他步骤(如setter注入)的bean来完成的,而且只能解决单例作用域的Bean循环依赖。通过提前暴露一个单例工厂方法,从而使其他bean能引用到该bean。

结合代码分析:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值