原因一、构造方法引起的循环依赖的错误
@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的实例了。
对于第二和第三种的原因,从代码上就要避免 出现这种问题。