美文网首页
Spring 三种方式的循环依赖

Spring 三种方式的循环依赖

作者: loveinthesweet | 来源:发表于2019-04-02 12:59 被阅读0次

循环依赖是指多个类循环嵌套引用,如:A类引用B类,B类引用C类,C类引用A类。

第一种:构造器参数循环依赖

Spring容器会将每一个正在创建的Bean标识放在一个“当前创建Bean池中,Bean标识符在创建过程中将一直保持在这个池中。
如果在创建Bean过程中发现自己已经在“当前创建Bean池”里时将抛出BeanCurrentlyInCreationException异常表示循环依赖;而创建完成的Bean将从“当前创建Bean池”中清除掉。

看如下实例:

看配置文件的构造器参数配置:
<bean id="a" class="com.soecode.lyf.test.StudentA" >
   <constructor-arg index="0" ref="b"/>
</bean>

<bean id="b" class="com.soecode.lyf.test.StudentB" >
     <constructor-arg index="0" ref="c" >
</bean>

<bean id="c" class="com.soecode.lyf.test.StudentC" >
     <constructor-arg index="0" ref="a" >
</bean>

这三个就是StudentA类中有StudentB类,StudentB类中有StudentC类,StudentC类中有StudentA类。

第二种:setter方式单列,默认方式

看如下实例:

setter 方式注入 scope默认为singleton
<bean id="a" class="com.soecode.lyf.test.StudentA" >
    <property name="studentB" ref="b">
</bean>

<bean id="b" class="com.soecode.lyf.test.StudentB" >
    <property name="studentC" ref="c" >
</bean>

<bean id="c" class="com.soecode.lyf.test.StudentC" >
    <property name="studentA" ref="a" >
</bean>
执行结果:

为什么用setter方式就不报错了呢?
/** Cache of singleton factories: bean name --> ObjectFactory(单例的工厂Bean缓存集合) */、privatefinalMap singletonFactories =newHashMap(16);

1.创建StudentA a单列时,首先无参构造创建,并暴露到singletonFactories中,并将a 标志符放到当前正在创建Bean池, 然后进行setter出入StudentB b。
2.创建StudentB b单列时,首先无参构造创建,并暴露到singletonFactories中,并将b 标志符放到当前正在创建Bean池, 然后进行setter出入StudentC c。
3.创建StudentC c单列时,首先无参构造创建,并暴露到singletonFactories中,并将b 标志符放到当前正在创建Bean池, 然后进行setter出入StudentA a。在注入 a 时,由于提前暴露在singletonFactories集合中了,利用它就可以取到 a 正在创建的Bean对象。
4. 最后依赖注入StudentB、StudentA

第三种:setter方式 原型注入

看配置文件:

scope=”property“ 意思是每一次请求都会创建一个实例对象。
两者的区别是:有状态的bean都使用property作用域,无状态的一般都使用singleton单列作用域。

看运行之后的控制台输出:

总结:为什么setter方式 singleton单列会成功,而setter方式 property原型会报BeanCurrentlyInCreationException?

因为单列的时候,会将bean放在缓存中,可以提前暴露此接口。
而property原型不会放入缓存中,无法提前暴露。

相关文章

  • Spring系列目录

    1、 Spring循环依赖的三种方式2、Spring事务代理机制总结

  • Spring 是如何解决循环依赖的?

    Spring 是如何解决循环依赖的? 循环依赖: Spring 循环依赖有三种情况: 构造器的循环依赖,这种依赖 ...

  • Spring 源码(八)循环依赖源码解析

    循环依赖是指两个或者多个Bean之前相互持有对方。在Spring中循环依赖一般有三种方式: 构造函数循环依赖 se...

  • 菜鸟学Spring系列之循环依赖

    Spring解决循环依赖的三种方式 引言: 循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的...

  • Spring是怎么解决循环依赖的?

    Spring是怎么解决循环依赖的?首先,Spring 解决循环依赖有两个前提条件: 不全是构造器方式的循环依赖必须...

  • Spring 三种方式的循环依赖

    循环依赖是指多个类循环嵌套引用,如:A类引用B类,B类引用C类,C类引用A类。 第一种:构造器参数循环依赖 Spr...

  • Spring循环依赖的三种方式

    引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时...

  • Spring循环依赖的三种方式

    引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行...

  • spring循环依赖的三种方式

    构造器的方式通过构造器参数注入,形成的循环依赖,无法解决,因为执行构造方法初始话之前会先将A放在正在创建的Bean...

  • spring4 IOC循环依赖问题

    1. 情况1:setter循环依赖 2. 情况2:构造器循环依赖 spring4 IOC获取单例对象方式 循环依赖...

网友评论

      本文标题:Spring 三种方式的循环依赖

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