时间:2021-05-19
循环依赖
定义: 循环依赖就是循环引用,就是两个或多个Bean相互之间的持有对方,比方CircularityA引用CircularityB,CircularityB引用CircularityC,CircularityC引用CircularityA。形成一个环状引用关系。
在使用Spring时,如果主要采用基于构造器的依赖注入方式,则可能会遇到循环依赖的情况,简而言之就是Bean A的构造器依赖于Bean B,Bean B的构造器又依赖于Bean A。在这种情况下Spring会在编译时抛出BeanCurrentlyInCreationException。
Class A
@Componentpublic 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
@Componentpublic 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); }}测试
@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。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
java中Springtask定时任务的深入理解在工作中有用到springtask作为定时任务的处理,spring通过接口TaskExecutor和TaskSc
深入理解JQuery循环绑定事件$(document).ready(function(){vararray=[0,1,2,3];//1.//始终弹出3,因为fu
扩展阅读c#基础系列1---深入理解值类型和引用类型c#基础系列2---深入理解String引言在上篇文章深入理解值类型和引用类型的时候,有的小伙伴就推荐说一说
首先看我们的源代码。复制代码代码如下:深入理解Javascriptconsole.log(this);深入理解Javascript我们知道,通过浏览器打开这个页
标题反映的是上周五一个同事咨询我的问题,我觉得这是一个很好的问题。这个问题有助于我们深入理解依赖注入框架在ASP.NETCore中的应用,以及服务实例的生命周期