此示例使用 HTML + Canvas 實現滑動拼圖驗證碼。Canvas繪制帶隨機缺口的背景,獨立滑塊按鈕監聽滑鼠/觸摸拖拽,實時將滑塊位置映射到Ca...
深度解析 Spring 源碼:三級緩存機制探究
本文摘要
Spring框架中的三級緩存機制包括:一級存儲完整bean,二級解決循環依賴提前暴露,三級存儲bean工廠支持AOP。它確保了單例bean的創建和管理,支持循環依賴和AOP,通過高效利用緩存提高了應用程序的穩定性和性能。
Spring 框架中的三級緩存機制主要與 `AbstractAutowireCapableBeanFactory` 類中的 `doCreateBean` 方法在解析和創建單例 bean 時所使用的緩存有關。這個機制主要用於解決循環依賴的問題,尤其是在構造器註入的場景下。以下是對 Spring 三級緩存機制的深度解析:
1. 三級緩存的定義

* 一級緩存(singletonObjects):存儲完全初始化好的 bean,即 bean 的所有屬性都已被設置,並且完成了初始化方法(如果有的話)的調用。
* 二級緩存(earlySingletonObjects):存儲提前暴露的 bean 實例的原始對象(即未完成屬性填充的對象)。這個緩存主要是為了解決循環依賴的問題。當一個 bean 的創建依賴於另一個尚未創建完成的 bean 時,這個尚未完成的 bean 會被提前暴露到這個二級緩存中,供其他 bean 使用。
* 三級緩存(singletonFactories):存儲 bean 的工廠對象(`ObjectFactory`),用於創建 bean 的實例。這個緩存主要用於解決 AOP 代理的問題。當 bean 需要被 AOP 代理時,Spring 會在這個緩存中保存一個能夠創建代理對象的工廠,而不是直接保存代理對象本身。
2. 緩存的使用流程
1. 創建 bean:當一個 bean 需要被創建時,Spring 首先會檢查一級緩存(singletonObjects)中是否存在該 bean 的實例。如果存在,則直接返回;否則,進入下一步。
2. 檢查是否存在循環依賴:在創建 bean 的過程中,如果發現該 bean 依賴於另一個尚未創建完成的 bean(即存在循環依賴),那麼 Spring 會嘗試從二級緩存(earlySingletonObjects)中獲取該依賴 bean 的實例。如果找到了,則使用該實例;否則,繼續下一步。
3. 提前暴露 bean:如果發現了循環依賴,但是二級緩存中沒有該依賴 bean 的實例,那麼 Spring 會提前將該 bean 的實例(尚未完成屬性填充的對象)暴露到二級緩存中,供其他 bean 使用。
4. 創建代理對象(如果需要):如果 bean 需要被 AOP 代理,那麼 Spring 會在這個步驟中創建代理對象。但是,代理對象本身並不會直接保存到緩存中,而是會保存一個能夠創建代理對象的工廠(`ObjectFactory`)到三級緩存(singletonFactories)中。
5. 填充屬性:完成 bean 的屬性填充(即依賴註入)。
6. 初始化 bean:調用 bean 的初始化方法(如果有的話)。
7. 完成創建並保存:將完全初始化好的 bean 保存到一級緩存(singletonObjects)中,並從二級緩存(earlySingletonObjects)和三級緩存(singletonFactories)中移除該 bean 的相關條目。
3. 為什麼要使用三級緩存
* 解決循環依賴:二級緩存的存在主要是為了解決循環依賴的問題。通過提前暴露 bean 的實例,可以確保在依賴註入時能夠找到所需的依賴對象。
* 支持 AOP:三級緩存的存在主要是為了支持 AOP。當 bean 需要被 AOP 代理時,Spring 不會直接保存代理對象到緩存中,而是保存一個能夠創建代理對象的工廠。這樣做的好處是,只有當真正需要代理對象時,才會去創建它,從而避免了不必要的性能開銷。
總結
Spring 的三級緩存機制是一個非常重要的特性,它使得 Spring 能夠在保證單例性的同時,支持循環依賴和 AOP。通過合理地使用這三個緩存,Spring 能夠高效地創建和管理 bean,從而確保整個應用程序的穩定性和性能。
相關文章
