spring 相互依赖,引入springboot依赖
目录
springboot相互依赖服务器相互依赖spring解决相互依赖问题构造器循环依赖设置器循环依赖字段属性注入循环依赖(原型)摘要
springboot相互依赖 server相互引用
公共类RoleService { @ auto wired @ lazy private user server user server;}公共类UserService { @ auto wired @ lazy private RoleService RoleService;}
spring解决相互依赖的问题
构造器循环依赖
@ service public class A { public A(B B){ } } @ service public class B { public C C(C C){ } } @ service public class C { public A(A A){ } }通过注入构造函数形成的循环依赖,这种依赖是无法解决的。只能引发BeancurrentlyCreationexception异常来指示循环依赖关系。
在描述:,创建A类构造函数需要B类,所以会创建B类,在创建B类的时候发现需要A类,然后会创建C类,最后在创建C类的时候发现又需要A类,这样就形成了一个环,不能创建了。
原理:容器将每个正在创建的bean标识符放在一个“当前创建的bean池”中,bean标识符会一直留在这个池中,因为如果在bean创建过程中发现自己在“当前创建的bean池”中,会抛出一个beancourrentincreationexception异常来表示循环依赖;创建的bean将从“当前创建的bean池”中清除。
setter循环依赖
@ service public class A1 { @ autowired private B1 B1;} @ service public class B1 { @ autowired public C1 C1;} @ service public class C1 { @ autowired public A1 A1;} setter注入形成的循环依赖。
原理:setter注入造成的依赖是通过Spring container暴露刚刚完成构造器注入但没有提前完成其他步骤(如setter注入)的bean来完成的,只能解决单实例作用域的bean循环依赖。
field属性注入循环依赖(prototype)
@ Service @ Scope( prototype )public class A1 { @ Autowired private B1 B1;} @Service @Scope(prototype )公共类B1 { @Autowired公共C1 C1;} @Service @Scope(prototype )公共类C1 { @ Autowired public A1 A1;}报告错误
小结一下
Spring只能解决Setter方法注入的singleton bean之间的循环依赖。
ClassA依赖ClassB,class b又依赖ClassA,形成一个依赖的闭环。当Spring获得ClassA的实例时,它将它暴露给正在创建的bean缓存,而不等待ClassA被创建。在解析ClassA的属性时,发现自己依赖于ClassB,于是又得到了它。
ClassB,在分析ClassB的性质时,发现需要用到ClassA的性质。但是,此时ClassA已经被提前暴露并添加到正在创建的bean的缓存中,所以不需要创建ClassA的新实例,直接从缓存中获取即可。从而解决了循环依赖的问题。
以上个人经验,希望能给大家一个参考,也希望大家能支持盛行的IT。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。