【Spring框架】一篇文章带你彻底搞懂Spring解决循环依赖的底层原理
Spring框架通过提供三级缓存解决了循环依赖问题。这三级缓存分别是:singletonFactories、earlySingletonObjects和singletonObjects。
- singletonFactories:存储的是 singleton 对象的工厂对象,用于创建对象。
- earlySingletonObjects:存储的是提前暴露的 singleton 对象,此时对象已经创建完成,但是还没有进行属性填充。
- singletonObjects:存储的是完全创建好的 singleton 对象,此时对象已经创建并且属性也已经填充。
以下是一个简化的示例,说明Spring是如何解决循环依赖的:
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 id="beanA" class="BeanA">
<property name="beanB" ref="beanB"/>
</bean>
<bean id="beanB" class="BeanB">
<property name="beanA" ref="beanA"/>
</bean>
当Spring容器开始创建beanA
时,它将其放入singletonFactories中,然后继续创建beanA
的依赖beanB
。当Spring容器开始创建beanB
时,它会检查是否存在beanA
,由于beanA
已经在创建过程中,它会从singletonFactories中获取beanA
的工厂对象来创建beanB
,然后将beanB
存入earlySingletonObjects。这样beanA
就可以使用beanB
的引用了,因为beanB
已经被提前暴露,即便它还没有完全创建完成。最后,完成beanB
的创建,此时beanB
也可以使用beanA
的引用了。
这样循环依赖的问题就被解决了,Spring通过三级缓存机制,在保证线程安全的前提下,实现了对bean的创建和依赖注入。
评论已关闭