spring-bean循环引用

当循环引用时,spring如何应对
情景:

A、B两个对象,相互引用,型如:

    <bean id="a" class="net.qingtian.aopdemo.xml.A" scope="singleton">
        <property name="b" ref="b" />
    </bean>
    <bean id="b" class="net.qingtian.aopdemo.xml.B" scope="singleton">
        <property name="a" ref="a" />
    </bean>
调用factory.getBean(“a”)后的执行过程:

1、创建对象A对象a。
2、创建AFactory对象,把AFactory对象放进Map中缓存。(addSingletonFactory方法)
3、给a对象的属性赋值,需要B对象,所以调用了factory.getBean(“b”)获取b。(populateBean方法)
4、创建B对象b。
5、创建BFactory对象,把BFactory对象放进Map中缓存。
6、给b对象的属性赋值,需要A对象,这时已经缓存了AFactory,获取到AFactory,通过AFactory可以获取到a对象,把a赋值给b的属性。
So,这样a和b就相互引用了,技巧就是在对象创建完成之前先把XXFactory缓存起来。

多个对象循环,累次类推。

Is there an unresolvable circular reference?
有时我们会见到如下一个异常:

Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'a': Requested bean is currently in creation: Is there an unresolvable circular reference?
出现这个异常时因为我们有一个循环引用,且循环引用的链上的对象全都是scope=”prototype”的,才出现这样的异常。这也很好理解,a创建b,b创建c,c创建a,没有单例,全都得创建新对象,这样会无穷尽的。当遇到这个异常时,需要准确的分析引用链。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值