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