深入理解Spring中的循环依赖

2025-05-29 0 46

循环依赖

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

深入理解Spring中的循环依赖

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

class a

?

1

2

3

4

5

6

7

8

9

10

11

12

13
@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

?

1

2

3

4

5

6

7

8

9

10

11

12

13
@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 = " + this);

}

}

测试

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14
@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。

总结

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

原文链接:http://www.cnblogs.com/xz816111/p/9048908.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 深入理解Spring中的循环依赖 https://www.kuaiidc.com/111995.html

相关文章

发表评论
暂无评论