Spring循环依赖产生的原因以及解决方式

原因一、构造方法引起的循环依赖的错误

@Component
public class Aest {

    private MathCalculator mathCalculator;
    @Autowired
    public Aest(MathCalculator mathCalculator){
        this.mathCalculator=mathCalculator;
    }
}
@Component
public class MathCalculator {
    private Aest aest;
    @Autowired
    public MathCalculator(Aest aest) {
        this.aest = aest;
    }
}

 产生原因:两个类进行实例化的时候,构造参数都需要对方的实例,因为Spring解决循环依赖的方式是,实例化完成之后就暴露出来给别人引用。所以Spring处理循环依赖的前提是:bean已经被实例化完成。

原因二、 DependsOn 导致的循环依赖

 @Bean
   @DependsOn("calculator")
   public Aest aset(){
       return new Aest();
   }

@Bean
   @DependsOn("aset")
   public MathCalculator calculator(){
   return new MathCalculator();
}

产生原因:Spring对于DependsOn 的处理过程在实例化Bean之前,所以也会存在这个问题。

原因三: Spring中Bean的模式是原型模式,是不支持循环依赖的

对于第一种原因的解决方式,就是不要在构造的时候进行依赖注入,可以采用属性的注入,

 @Autowired
private MathCalculator mathCalculator;

此种方式,可以的原因是,对于Bean属性的赋值是在实例化之后,这个时候已经加入到SingletonFactories中了。其他的Bean可以获取到此Bean的实例了。

 对于第二和第三种的原因,从代码上就要避免 出现这种问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值