springboot相互依赖 server相互引用方式
程序员文章站
2024-03-27 22:10:28
springboot相互依赖 server相互引用spring解决相互依赖的问题构造器循环依赖通过构造器注入构成的循环依赖,此依赖是无法解决的,只能抛出beancurrentlyincreatione...
springboot相互依赖 server相互引用
spring解决相互依赖的问题
构造器循环依赖
通过构造器注入构成的循环依赖,此依赖是无法解决的,只能抛出beancurrentlyincreationexception异常表示循环依赖
描述:创建a类是,构造器需要b类,那将去创建b,在创建b时又发现需要a类,则又去创建c类,最终在创建c时发现又需要a,从而形成一个环,没办法创建。
原理:spring容器将每一个正在创建的bean标识符放在一个“当前创建bean池”中,bean标识符创建过程中将一直保持在这个池中,因为如果在创建bean过程中发现自己已经在“当前创建bean池”中时,将会抛出beancurrentlyincreationexception异常表示循环依赖;而对于创建完毕的bean将从“当前创建bean池”中清除掉。
setter循环依赖
通过setter注入方式构成的循环依赖。
原理:对于setter注入造成的依赖是通过spring容器提前暴露刚完成构造器注入但未完成其他步骤(比如setter注入)的bean来完成的,而且只能解决单例作用域的bean循环依赖。
field属性注入循环依赖(prototype)
报错
小结一下
spring只能解决setter方法注入的单例bean之间的循环依赖
classa依赖classb,classb又依赖classa,形成依赖闭环。spring在获取classa的实例时,不等classa完成创建就将其曝光加入正在创建的bean缓存中。在解析classa的属性时,又发现依赖于classb,再次去获取
classb,当解析classb的属性时,又发现需要classa的属性,但此时的classa已经被提前曝光加入了正在创建的bean的缓存中,则无需创建新的的classa的实例,直接从缓存中获取即可。从而解决循环依赖问题。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。