目录
一.普通依赖
比如ClassA 依赖 ClassB
@Component
public class ClassA {
@Autowired
private ClassB classB;
}
流程:
1.getBean(classA) -> doGetBean(classA)
2.getSingleton(classA,true) singletonsCurrentlyInCreation也是空 返回null
3.this.getSingleton方法,放入singletonsCurrentlyInCreation容器
4.调用creatBean(classA) -> doCreatBean(classA)
5.把key=classA,value=getEarlyBeanReference() 放入singletonFactories(三级缓存)
//三级缓存
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap(16);
6.执行到populateBean 进行DI ,发现ClassA依赖ClassB
7.getBean(classB),如果Ioc容器有这个对象就直接拿到然后给ClassA注入,如果没有这个bean对象就会继续走完ClassB 的第1~6逻辑,然后走完B的流程 把ClassB放到 singletonObjects(一级缓存)Ioc容器中 然后回到ClassA的流程 把B成功注入
8.ClassA 继续执行自己的流程 initializeBean
9.最后ClassA 放到singletonObjects(一级缓存)Ioc容器中
二.循环依赖
ClassA 依赖 ClassB ClassB也依赖ClassA
@Component
public class ClassA {
@Autowired
private ClassB classB;
}
@Component
public class ClassB {
@Autowired
private ClassA classA;
}
流程:
1.getBean(classA) -> doGetBean(classA)
2.getSingleton(classA,true) singletonsCurrentlyInCreation也是空 返回null
3.this.getSingleton方法,放入singletonsCurrentlyInCreation容器
4.调用creatBean(classA) -> doCreatBean(classA)
5.把key=classA,value=getEarlyBeanReference() 放入singletonFactories(三级缓存)
6.执行到populateBean 进行DI ,发现ClassA依赖ClassB
7.getBean(classB),继续走完ClassB 的第1~5逻辑,然后ClassB执行到populateBean方法进行DI时发现他又依赖ClassA
8.getBean(classA),因为我们之前已经把 【key=classA,value=getEarlyBeanReference() 放入singletonFactories(三级缓存)】,去拿三级缓存 调用getEarlyBeanReference方法
- getEarlyBeanReference方法 会去调用getEarlyBeanReference, 这个方法有2个实现类,一个是代理,一个是原生, 如果说classA是个代理对象的话,会去生成一个代理类,并且先放入earlyProxyReferences缓存如果不是代理对象的话就返回原生的bean
- 然后把代理bean或者原生bean放入earlySingletonObjects(二级缓存)中
//二级缓存
private final Map<String, Object> earlySingletonObjects = new HashMap(16);
singletonObjecties 一级缓存 :完全体的bean实例
earlySingletonObjects 二级缓存 :代理bean 或者 原生bean的半成品实例
singletonFactories 三级缓存 :key=classA,value=getEarlyBeanReference