Spring 三級緩存

簡介

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ù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容