Spring三级缓存
- 前置知识
- 三级缓存定义
- SpringBean生命周期
- Bean的初始化
- getSingleton 分析
- 加入一级缓存
- CreateBean过程(A)
- A填充属性B
- B填充属性A,执行getSingleton(A)
- B完成初始化
前置知识
三级缓存定义
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
//一级缓存,成熟的对象,对象已经完成实例化和初始化,同一个对象只会出现在一个缓存中,三个缓存的对象不可能重复
/** Cache of singleton objects: bean name to bean instance. */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
//三级缓存,存放的是制造对象的方法,方法一经调用就会创造一个对象存放到二级缓存中
/** Cache of singleton factories: bean name to ObjectFactory. */
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
//二级缓存,提前暴露的缓存,缓存中的对象已经实例化,但尚未初始化。early:暴露
/** Cache of early singleton objects: bean name to bean instance. */
private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);
}
SpringBean生命周期
例子:
Bean的初始化
getSingleton 分析
作用:
- 调用singletonFactory.getObject()创建bean
- 放入一级缓存
加入一级缓存
CreateBean过程(A)
重点1:此处A实例化后放入了三级缓存
A填充属性B
B填充属性A,执行getSingleton(A)
() -> getEarlyBeanReference(beanName, mbd, bean),三级缓存创建对象,执行的是此处代码
B完成初始化
B初始化完成后,A也完成初始化,并放入一级缓存,并移除其他级别的缓存