图解Spring循环依赖解决过程

662 阅读1分钟

前言:这是我第一次写文章,这里写的都是我一行行代码调试验证的结果,这里省略了很多细节只是一个大概的思路,有问题欢迎大家指正。

1.spring解决循环依赖用到了一个Set集合,三个Map集合;

org.springframework.beans.factory.support.DefaultSingletonBeanRegistry:
// 已经被实例出来,但是还不是bean的。bean的名字
private final Set<String> singletonsCurrentlyInCreation;
// 已经是完整的bean了(依赖注入、AOP都已完成。是一个完整的bean)
private final Map<String, Object> singletonObjects;
// 还不是完整的bean(还未完成依赖注入)
private final Map<String, Object> earlySingletonObjects;
// 基于通过class创建的实例,构造的工厂
private final Map<String, ObjectFactory<?>> singletonFactories;

2.最最重要的方法大家品,细品,使劲儿品。解决循环依赖的精髓都在这里了。上面提到的四个集合这个方法都用到了。 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, boolean)

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 (singletonObject == null && allowEarlyReference) {
					ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
					if (singletonFactory != null) {
						singletonObject = singletonFactory.getObject();
						this.earlySingletonObjects.put(beanName, singletonObject);
						this.singletonFactories.remove(beanName);
					}
				}
			}
		}
		return (singletonObject != NULL_OBJECT ? singletonObject : null);
	}

3.一个简单的循环依赖的例子

class A{B b}
class B{A a}

4.整个注入流程

5.原图自取: 链接:pan.baidu.com/s/1aTkT1tgq… 提取码:3onw