什么是循环依赖?
循环依赖其实就是两个或者两个以上的bean,互相引用对方,形成闭环,如A--->B,B--->C,C--->A。这样的依赖就是循环依赖。而循环依赖在正常的情况下就是一个死循环,A的初始化为引起B的初始化,B的初始化会触发C的初始化,而C的初始化会触发A的初始化,死循环了。
Spring的循环依赖有两种:
- 构造器的循环依赖
- 属性的循环依赖
构造器的循环依赖是没有Spring的无法解决,所以会抛出异常。我们分析的都是基于属性的循环依赖。
循环依赖的处理。
第一次处理循环依赖的地方是doGetBean()方法中的:
Object sharedInstance = getSingleton(beanName);
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
synchronized (this.singletonObjects) {
singletonObject = this.earlySingletonObjects.get(beanName);
if (