缓存类型1级缓存存放的是最终创建完的完整对象
Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256)
2级缓存如果不存在aop情况下,存放的是普通不完整对象,属性没有填充。如果存在aop情况下,存放的是aop的代理对象,目标对象仍然是不完整的。
Map<String, Object> earlySingletonObjects = new ConcurrentHashMap<>(16)
3级缓存当执行createBeanInstance创建出不完整对象(属性没有填充好)后,就会放到此缓存中类型为ObjectFactory的原因是根据是否存在aop从而调用ObjectFactory.getObject()时判断创建是普通对象还是aop代理对象
Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16)
- a首先实例化,实例化通过
ObjectFactory将不完整的对象a存放到在三级缓存singletonFactories中 - 填充属性b,发现b还未进行过加载,就会先去加载b对象
- 再加载b的过程中,实例化,也通过
ObjectFactory将不完整的对象b存放到在三级缓存singletonFactories中 - 填充属性a的时候,这时候能够从三级缓存
singletonFactories中拿到半成品的ObjectFactory类型的a对象 - 拿到ObjectFactory对象后,调用
ObjectFactory.getObject()方法最终会调用getEarlyBeanReference()方法,如果bean被AOP切面代理则返回的是代理对象,如果未被代理则返回的是原bean实例 - 放入二级缓存
earlySingletonObjects中,从三级缓存singletonFactories中移除 - 属性a填充完毕
- 对象b放到一级缓存
singletonObjects - 对象a的属性b填充完毕
- 对象a放到一级缓存
singletonObjects