spring解决循环依赖的方法

1.构造器循环依赖

无法解决,只能抛出循环依赖异常

Spring把正在创建的bean定义一个标识,并且存放在一个”当前创建bean池”中,bean在创建过程中表示会一直在池中不会消失,如果该bean再次被创建时它会在池中找到自己已经在创建中,此时就会报出循环依赖异常,而对已经创建完成的bean,则会把其标识从"当前创建线程池”中删除.

2.setter循环依赖

 可以解决

解决方案是Spring容器提前暴露刚完成构造器注入但未完成其他步骤的bean来完成的,而且只能解决单例作用域的循环依赖

通过提前暴露一个单例工厂方法,从而使其他bean能引用到该bean

addSingletonFactory (beanName,new ObjectFactory() {

    Public Object getObject() throw BeanException{

           Return getEarlyBeanReference(beanName,mbd,bean);     

    }

});

<bean id=“testA” class=“com.bean.TestA”>

    <constructor-arg index = “0” ref=“testB”/>

<bean/>

<bean id=“testB” class=“com.bean.TestB”>

    <constructor-arg index = “0” ref=“testC”/>

<bean/>

<bean id=“testC” class=“com.bean.TestC”>

    <constructor-arg index = “0” ref=“testA”/>

<bean/>

过程:

1.spring容器创建单例”testA”bean  并暴露一个”ObjectFactory" 用于返回一个提前暴露一个创建中的bean,并将”testA”标识放到"当前创建bean池” 然后进行setter注入”testB"

2.spring容器创建单例”testB”bean  并暴露一个”ObjectFactory" 用于返回一个提前暴露一个创建中的bean,并将”testB”标识放到"当前创建bean池” 然后进行setter注入”testC”

3.spring容器创建单例”testC”bean  并暴露一个”ObjectFactory" 用于返回一个提前暴露一个创建中的bean,并将”testC”标识放到"当前创建bean池” 然后进行setter注入”testA",由于testA提前暴露"ObjectFactory"工厂,从而使用它返回一个提前暴露的在创建中的bean

4.最后在依赖注入"testB","testC"

3.prototype范围循环依赖

无法解决

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容