spring源码 循环依赖
Spring 容器解决循环依赖的基本思路是提前暴露一个代理对象,而不是立即返回完全构造好的对象。代理对象可以是对象的原始引用(如在创建Bean的早期阶段)或者是一个需要完全构造的对象的代理。
以下是一个简化的例子,展示了Spring如何解决单例bean的循环依赖问题:
public class BeanA {
private BeanB beanB;
public void setBeanB(BeanB beanB) {
this.beanB = beanB;
}
public BeanB getBeanB() {
return beanB;
}
}
public class BeanB {
private BeanA beanA;
public void setBeanA(BeanA beanA) {
this.beanA = beanA;
}
public BeanA getBeanA() {
return beanA;
}
}
// 在Spring容器中配置这两个bean
<bean id="beanA" class="BeanA">
<property name="beanB" ref="beanB"/>
</bean>
<bean id="beanB" class="BeanB">
<property name="beanA" ref="beanA"/>
</bean>
Spring 容器在创建 beanA
时,会先完全实例化它,但不会立即注入 beanB
,因为 beanB
还没有创建。然后 Spring 容器会提前暴露一个代理对象来替代 beanA
,这样就可以创建 beanB
,在 beanB
中设置 beanA
的时候,使用的是代理对象,不会发生循环依赖。最后,Spring 容器会填充代理对象的缺失属性,使得两个bean可以相互引用。
评论已关闭