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的实例了。

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

你可能感兴趣的:(Spring源码解析,Spring问题,Spring面试)