当循环引用时,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,没有单例,全都得创建新对象,这样会无穷尽的。当遇到这个异常时,需要准确的分析引用链。