深入理解Spring中的循环依赖

网友投稿 344 2023-02-04


深入理解Spring中的循环依赖

循环依赖

定义: 循环依赖就是循环引用,就是两个或多个Bean相互之间的持有对方,比方CircularityA引用CircularityB,CircularityB引用CircularityC,CircularityC引用CircularityA。形成一个环状引用关系。

在使用Spring时,如果主要采用基于构造器的依赖注入方式,则可能会遇到循环依赖的情况,简而言之就是Bean A的构造器依赖于Bean B,Bean B的构造器又依赖于Bean A。在这种情况下Spring会在编译时抛出BeanCurrentlyInCreationException。

Class A

@Component

public class ClassA {

private ClassB classB;

@Autowired

public ClassA(ClassB classB) {

this.classB = classB;

}

public void printClass() {

System.out.println("Class A = " + this);

System.out.println("Class B = " + classB);

}

}

Class B

@Component

public class ClassB {

private ClassA classA;

@Autowired

public ClassB(ClassA classA) {

this.classA = classA;

}

public void printClass() {

System.out.println("Class A = " + classA);

System.out.println("Class B = "http:// + this);

}

}

测试

@ContextConfiguration(classes = {ClassA.class, ClassB.class})

@RunWith(SpringRunner.class)

public class MyTest {

@Autowired

private ClassA classA;

@Autowired

private ClassB classB;

@Test

public void name() {

classA.printClass();

classB.printClass();

}

}

原因

这时候运行测试就会发现抛出了BeanCurrentlyInCreationException异常。产生这种情况的原因是,Spring在创建Bean时,会首先实例化对象,然后再注入依赖。假设Spring首先创建Class A,那么就会发现在构造器里有Class B的依赖,所以就会转去创建Class B,又在Class B的构造器里发现了对Class A的依赖,而此时Class A是还未初始化完的,因此又会转去创建Class A,这样就陷入了死循环。

解决方法

换成基于setter的依赖注入即可解决这个问题。因为基于setter的依赖注入会首先调用默认构造函数来实例化对象,然后再调用setter实现依赖注入。这样在对象实例化的阶段就没有了任何依赖,因此Class A实例化完成后再调用Class B,Class B实例化完成后开始设值,而这时Class A已经是实例化完成了的,所以可以成功引用到Class A。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:结合Vue控制字符和字节的显示个数的示例
下一篇:利用网线连接共享文件夹(电脑网线共享文件夹)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~