簡介
package org.springframework.beans.factory.support;
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);
/** Cache of early singleton objects: bean name to bean instance. */
private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap<>(16);
}
-
singletonObjects:一級緩存,調(diào)用 getBean() 可以直接獲取初始化完成的 單例對象。
-
earlySingletonObjects:二級緩存,已經(jīng)被 AOP 增強,但是還有屬性沒有注入完。
-
singletonFactories:遍歷所有的 BeanPostProcessor 后置處理器,通過 SmartInstantiationAwareBeanPostProcessor 類型的后置處理器進行 AOP 增強。
緩存初始化時機
-
singletonFactories:實例化對象(createBeanInstance 方法)之后,填充屬性(populateBean 方法)之前。
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
throws BeanCreationException {
// 1. 實例化 Bean 對象
BeanWrapper instanceWrapper = createBeanInstance(beanName, mbd, args);
// 2. 把用 lambda 表達式 表示的 ObjectFactory,添加到 singletonFactories 緩存
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
// Initialize the bean instance.
Object exposedObject = bean;
try {
// 3. 填充 Bean 對象的屬性
populateBean(beanName, mbd, instanceWrapper);
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
return exposedObject;
}
-
earlySingletonObjects:存在循環(huán)引用時才會初始化。在 getSingleton() 方法中,通過 singletonFactories 獲取到 AOP 對象后填入。
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) {
// 1. 獲取到 ObjectFactory 緩存
ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
if (singletonFactory != null) {
// 2. 通過 `getEarlyBeanReference()` 方法得到 AOP 增強的代理對象
singletonObject = singletonFactory.getObject();
// 3. 將 AOP 增強的代碼對象存放到 earlySingletonObjects 緩存中
this.earlySingletonObjects.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
}
}
}
}
return singletonObject;
}
-
singletonObjects:單例對象 初始化完成(屬性填充完畢,以及執(zhí)行完所有的 Spring 初始化生命周期方法后)填入。
參考
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。