Spring三級緩存流程圖
- singletonObjects(一級緩存):緩存經過了完整生命周期的Bean;
- arlySingletonobjects(二級緩存):緩存未經過完整生命周期的Bean,如果某個Bean出現了循環依賴,就會提前把這個暫時未經過完整生命周期的Bean放入earlySingletonObjects中,這個Bean如果要經過AOP,那么就會把代理對象放入earlySingletonObjects中,否則就是把原始對象放入earlySingletonObjects,但是不管怎么樣,就是是代理對象,代理對象所代理的原始對象也是沒有經過完整生命周期的,所以放入earlySingletonObjects我們就可以統一認為是未經過完整生命周期的Bean;
- singletonFactories(三級緩存):緩存的是一個ObjectFactory,也就是一個Lambda表達式。再每個Bean的生成過程中,經過實例化得到一個原始對象后,都會提前基于原始對象暴露一個Lambda表達式,并保存到三級緩存中,這個Lambda表達式可能用到,也可能用不到,如果當前Bean沒有出現循環依賴,那么這個Lambda表達式沒用,當前Bean按照自己的生命周期正常執行,執行完后直接把當前Bean放入singletonObjects中,如果當前Bean再依賴注入時發現出現了循環依賴(當前正在創建的Bean被其他Bean以來了),則從三級緩存中拿到Lambda表達式,并執行Lambda表達式得到一個對象,并把得到的對象放入二級緩存(如果當前Bean需要AOP,那么執行Lambda表達式,得到就是對應的代理對象,如果無需AOP,則直接得到一個原始對象);
- 其實還有一個緩存,就是earlyProxyReferences,它用來記錄某個原始對象是否進行過AOP了。