1. Bean的循环依赖(set注入)
/*妻子和丈夫是循环依赖的,也就是说妻子依赖于丈夫,丈夫依赖于妻子*/
public class wife {
private String name;
private husband husband;
@Override
public String toString() {
return "wife{" +
"name='" + name + '\'' +
", husband=" + husband.getName() +
'}';
}
/*添加相关的set和get方法*/
}
/* 丈夫类和妻子类相似*/
public class husband {
private String name;
private wife wife;
public String getName() {
return name;
}
..........
}
<bean id="wifeBean" class="com.xiaofan.CircleBean.wife" >
<property name="name" value="小张" />
<property name="husband" ref="husbandBean"/>
</bean>
<bean id="husbandBean" class="com.xiaofan.CircleBean.husband">
<property name="name" value="xiaofan"/>
<property name="wife" ref="wifeBean" />
</bean>
singleton + setter 模式下的循环依赖是没有任何问题的 singleton 表示在整个Spring容器中是单例的,独一无二的对象 singleton + setter 为什么不会出现问题?Spring是怎么应对的? 主要原因是,在这种模式下Spring对Bean的管理主要分为清晰的两个阶段: 第一个阶段:在Spring容器加载的时候,实例化Bean,只要其中任意一个Bean实例化之后,马上进行“曝光”(不等属性复制就曝光) 第二个阶段:Bean "曝光" 之后,在进行属性的赋值! 核心解决方案是:实例化对象和对象的属性分为两个阶段来完成的 注意:只有在scope是singleton 的情况下,Bean才会采取提前“曝光”的措施!BeanCreationException:当前Bean正在处于创建中异常 当两个Bean的scope都是prototype才会出现异常,只要一个是singleton ,这个循环依赖就不会出现问题
2.Bean的循环依赖(构造注入不能解决循环依赖)
public Wife(String name, Husband husband) {
this.name = name;
this.husband = husband;
}
//--------------------------------------------------
<!--构造注入:index : 表示第几个参数 ?
注意:基于构造注入的方式下产生的循环依赖是无法解决的,所以在编写代码时,一定要注意
-->
<bean id="husbandBean" scope="singleton" class="com.xiaofan.CircleBean.Husband">
<constructor-arg index="0" value="xiaofan" />
<constructor-arg index="1" ref="wifeBean" />
</bean>
<bean id="wifeBean" scope="singleton" class="com.xiaofan.CircleBean.Wife">
<constructor-arg index="0" value="xiaozhang" />
<constructor-arg index="1" ref="husbandBean" />
</bean>
出现的异常:
Requested bean is currently in creation: Is there an unresolvable circular reference?