Spring框架中的三級緩存用于緩存Bean的創建,主要是為了解決循環依賴的問題。三級緩存一共包括singletonFactories、earlySingletonObjects和singletonObjects三個緩存。
singletonFactories緩存:保存了已經創建但是還沒有完成初始化的Bean的工廠對象。當需要獲取一個Bean時,首先會從該緩存中查找,如果能找到對應的工廠對象,則使用該工廠對象進行創建并返回。
earlySingletonObjects緩存:保存了已經完成初始化但是還沒有執行完所有生命周期方法的Bean對象。當一個Bean的初始化方法正在執行時,該Bean會被放入earlySingletonObjects緩存中。當其他Bean需要依賴該Bean時,會從該緩存中獲取已經初始化的Bean對象。
singletonObjects緩存:保存了已經完成初始化且執行完所有生命周期方法的Bean對象。當一個Bean的初始化方法執行完成后,會從earlySingletonObjects緩存中移除,并將完成初始化的Bean對象放入singletonObjects緩存中。
使用三級緩存的具體步驟如下:
首先,通過DefaultSingletonBeanRegistry類的getSingleton方法判斷是否已經存在該Bean的緩存對象。如果存在,則直接從singletonObjects緩存中獲取Bean對象,否則繼續下一步。
接著,調用createBean方法創建Bean對象。在創建Bean對象的過程中,會先從singletonFactories緩存中查找是否存在該Bean的工廠對象。如果存在,則使用該工廠對象進行創建,并將創建的Bean對象放入earlySingletonObjects緩存中。
然后,繼續執行createBean方法,完成Bean對象的初始化和執行生命周期方法的過程。在該過程中,如果有其他Bean需要依賴該Bean,則會從earlySingletonObjects緩存中獲取已經初始化的Bean對象。
最后,將初始化完成的Bean對象放入singletonObjects緩存中,并從earlySingletonObjects緩存中移除。
通過使用三級緩存,Spring框架可以解決循環依賴的問題,并且可以提高Bean的創建和初始化的效率。