美文网首页
spring解决循环依赖的方法

spring解决循环依赖的方法

作者: 叶小松_ea46 | 来源:发表于2021-07-20 10:11 被阅读0次

    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范围循环依赖

    无法解决

    相关文章

      网友评论

          本文标题:spring解决循环依赖的方法

          本文链接:https://www.haomeiwen.com/subject/ewoeeltx.html