3.2.1 什么是循环依赖
循环依赖就是循环引用,就是两个或多个Bean相互之间的持有对方,比如CircleA引用CircleB,CircleB引用 CircleC,CircleC引用CircleA,则它们最终反映为一个环。此处不是循环调用,循环调用是方法之间的环调用。如图3-5所示:
aaarticlea/png;base64,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*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" alt="" />
图3-5 循环引用
循环调用是无法解决的,除非有终结条件,否则就是死循环,最终导致内存溢出错误。
Spring容器循环依赖包括构造器循环依赖和setter循环依赖,那Spring容器如何解决循环依赖呢?首先让我们来定义循环引用类:
package cn.javass.spring.chapter3.bean;
public class CircleA {
private CircleB circleB;
public CircleA() {
}
public CircleA(CircleB circleB) {
this.circleB = circleB;
}
public void setCircleB(CircleB circleB)
{
this.circleB = circleB;
}
public void a() {
circleB.b();
}
}
package cn.javass.spring.chapter3.bean;
public class CircleB {
private CircleC circleC;
public CircleB() {
}
public CircleB(CircleC circleC) {
this.circleC = circleC;
}
public void setCircleC(CircleC circleC)
{
this.circleC = circleC;
}
public void b() {
circleC.c();
}
}
package cn.javass.spring.chapter3.bean;
public class CircleC {
private CircleA circleA;
public CircleC() {
}
public CircleC(CircleA circleA) {
this.circleA = circleA;
}
public void setCircleA(CircleA circleA)
{
this.circleA = circleA;
}
public void c() {
circleA.a();
}
}
3.2.2 Spring如何解决循环依赖
一、构造器循环依赖:表示通过构造器注入构成的循环依赖,此依赖是无法解决的,只能抛出BeanCurrentlyInCreationException异常表示循环依赖。
如在创建CircleA类时,构造器需要CircleB类,那将去创建CircleB,在创建CircleB类时又发现需要CircleC类,则又去创建CircleC,最终在创建CircleC时发现又需要CircleA;从而形成一个环,没办法创建。
Spring 容器将每一个正在创建的Bean 标识符放在一个“当前创建Bean池”中,Bean标识符在创建过程中将一直保持在这个池中,因此如果在创建Bean过程中发现自己已经在“当前创建 Bean池”里时将抛出BeanCurrentlyInCreationException异常表示循环依赖;而对于创建完毕的Bean将从“当前创建 Bean池”中清除掉。
1)首先让我们看一下配置文件(chapter3/circleInjectByConstructor.xml):
<bean id="circleA" class="cn.javass.spring.chapter3.bean.CircleA">
<constructor-arg index="0" ref="circleB"/>
</bean>
<bean id="circleB" class="cn.javass.spring.chapter3.bean.CircleB">
<constructor-arg index="0" ref="circleC"/>
</bean>
<bean id="circleC" class="cn.javass.spring.chapter3.bean.CircleC">
<constructor-arg index="0" ref="circleA"/>
</bean>
2)写段测试代码(cn.javass.spring.chapter3.CircleTest)测试一下吧:
@Test(expected = BeanCurrentlyInCreationException.class)
public void testCircleByConstructor() throws Throwable {
try {
new ClassPathXmlApplicationContext("chapter3/circleInjectByConstructor.xml");
}
catch (Exception e) {
//因为要在创建circle3时抛出;
Throwable e1 = e.getCause().getCause().getCause();
throw e1;
}
}
让我们分析一下吧:
1、Spring容器创建“circleA” Bean,首先去“当前创建Bean池”查找是否当前Bean正在创建,如果没发现,则继续准备其需要的构造器参数“circleB”,并将“circleA” 标识符放到“当前创建Bean池”;
2、Spring容器创建“circleB” Bean,首先去“当前创建Bean池”查找是否当前Bean正在创建,如果没发现,则继续准备其需要的构造器参数“circleC”,并将“circleB” 标识符放到“当前创建Bean池”;
3、Spring容器创建“circleC” Bean,首先去“当前创建Bean池”查找是否当前Bean正在创建,如果没发现,则继续准备其需要的构造器参数“circleA”,并将“circleC” 标识符放到“当前创建Bean池”;
4、到此为止Spring容器要去创建“circleA”Bean,发现该Bean 标识符在“当前创建Bean池”中,因为表示循环依赖,抛出BeanCurrentlyInCreationException。
二、setter循环依赖:表示通过setter注入方式构成的循环依赖。
对于setter注入造成的依赖是通过Spring容器提前暴露刚完成构造器注入但未完成其他步骤(如setter注入)的Bean来完成的,而且只能解决单例作用域的Bean循环依赖。
如下代码所示,通过提前暴露一个单例工厂方法,从而使其他Bean能引用到该Bean。
addSingletonFactory(beanName, new ObjectFactory() {
public Object getObject() throws BeansException {
return getEarlyBeanReference(beanName, mbd, bean);
}
});
具体步骤如下:
1、Spring容器创建单例“circleA” Bean,首先根据无参构造器创建Bean,并暴露一个“ObjectFactory ”用于返回一个提前暴露一个创建中的Bean,并将“circleA” 标识符放到“当前创建Bean池”;然后进行setter注入“circleB”;
2、Spring容器创建单例“circleB” Bean,首先根据无参构造器创建Bean,并暴露一个“ObjectFactory”用于返回一个提前暴露一个创建中的Bean,并将 “circleB” 标识符放到“当前创建Bean池”,然后进行setter注入“circleC”;
3、Spring容器创建单例“circleC” Bean,首先根据无参构造器创建Bean,并暴露一个“ObjectFactory ”用于返回一个提前暴露一个创建中的Bean,并将“circleC” 标识符放到“当前创建Bean池”,然后进行setter注入“circleA”;进行注入“circleA”时由于提前暴露了 “ObjectFactory”工厂从而使用它返回提前暴露一个创建中的Bean;
4、最后在依赖注入“circleB”和“circleA”,完成setter注入。
对于“prototype”作用域Bean,Spring容器无法完成依赖注入,因为“prototype”作用域的Bean,Spring容器不进行缓存,因此无法提前暴露一个创建中的Bean。
<!-- 定义Bean配置文件,注意scope都是“prototype”-->
<bean id="circleA" class="cn.javass.spring.chapter3.bean.CircleA" scope="prototype">
<property name="circleB" ref="circleB"/>
</bean>
<bean id="circleB" class="cn.javass.spring.chapter3.bean.CircleB" scope="prototype">
<property name="circleC" ref="circleC"/>
</bean>
<bean id="circleC" class="cn.javass.spring.chapter3.bean.CircleC" scope="prototype">
<property name="circleA" ref="circleA"/>
</bean>
//测试代码cn.javass.spring.chapter3.CircleTest
@Test(expected = BeanCurrentlyInCreationException.class)
public void testCircleBySetterAndPrototype () throws Throwable {
try {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
"chapter3/circleInjectBySetterAndPrototype.xml");
System.out.println(ctx.getBean("circleA"));
}
catch (Exception e) {
Throwable e1 = e.getCause().getCause().getCause();
throw e1;
}
}
对于“singleton”作用域Bean,可以通过“setAllowCircularReferences(false);”来禁用循环引用:
@Test(expected = BeanCurrentlyInCreationException.class)
public void testCircleBySetterAndSingleton2() throws Throwable {
try {
ClassPathXmlApplicationContext ctx =
new ClassPathXmlApplicationContext();
ctx.setConfigLocation("chapter3/circleInjectBySetterAndSingleton.xml");
ctx.refresh();
}
catch (Exception e) {
Throwable e1 = e.getCause().getCause().getCause();
throw e1;
}
}
补充:出现循环依赖是设计上的问题,一定要避免!
请参考《敏捷软件开发:原则、模式与实践》中的“无环依赖”原则