gpt4 book ai didi

深入理解Spring中的循环依赖

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章深入理解Spring中的循环依赖由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

循环依赖 。

 定义: 循环依赖就是循环引用,就是两个或多个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.

总结 。

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

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

最后此篇关于深入理解Spring中的循环依赖的文章就讲到这里了,如果你想了解更多关于深入理解Spring中的循环依赖的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com