深度解析 Spring 源碼:三級緩存機制探究

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,從而確保整個應用程序的穩定性和性能。

分享給朋友:

“深度解析 Spring 源碼:三級緩存機制探究” 的相關文章

JS跳轉頁面代碼及例子

JS跳轉頁面代碼及例子

JS跳轉頁面是一種很常見的前端交互技術,下面是幾種跳轉頁面的方式:1. 直接修改 `window.location.href` 屬性,2. 使用 `window.location.replace` 方法,此方法會替換當前頁面歷史記錄,不會在瀏覽器歷史記錄中留下痕跡。3. 使用 `window.open` 方法在一個新的瀏覽器窗口或標簽頁中打開一個頁面,4. 如果你需要在某個時間間隔後自動跳轉到目標頁面,可以使用 `setTimeout` 函數。…

一個簡單的html結婚特效的代碼

一個簡單的html結婚特效的代碼

以下是一個簡單的html結婚特效的代碼:1. 使用html和css定義了一個結婚的基本樣式;2. 分別定義新娘和新郎,並使用background-image設置其背景圖;3. 定義一個心形圖案,並使用animation讓其跳動。…

用html和CSS3制作酷炫的導航欄代碼及例子

用html和CSS3制作酷炫的導航欄代碼及例子

使用HTML5和CSS3的新特性可以制作出很多酷炫的導航欄效果,例如下拉菜單、響應式導航欄、帶有動態效果的導航欄等等。下面以下拉菜單為例,具體步驟如下:1. 創建 HTML 結構;2. 設置基本樣式;3. 添加動態效果。這樣就可以制作出下拉菜單效果,當滑鼠懸停在菜單項上時,菜單項下面的下拉菜單顯示出來,同時菜單項上的箭頭指向上方,滑鼠移開時,下拉菜單消失。在此過程中,使用了CSS3的過渡效果和旋轉效果,使效果更加炫酷。  …

3d旋轉魔方相冊代碼源碼,html代碼示例

3d旋轉魔方相冊代碼源碼,html代碼示例

以下是一組HTML代碼源碼示例,用於展示3D旋轉魔方相冊:<h1>3D旋轉魔方相冊</h1><div class="gallery"><div class="gallery-item">代碼解釋:1. `<style>`:用於在HTML內部設置CSS樣式。2. `.gallery`:CSS選擇器,用於設置整個相冊的樣式。`display: flex`和`justify-content: center`讓相冊的卡片居中顯示。3. `.gallery-item`:CSS選擇器,用於設置每個魔方圖像卡片的樣式。…

3d旋轉特效html源碼,用HTML和CSS實現效果特效

3d旋轉特效html源碼,用HTML和CSS實現效果特效

以下是一組用HTML和CSS實現3D旋轉特效的代碼例子。<title>3D旋轉魔方相冊示例</title>這段代碼實現了一個立方體的3D旋轉特效。首先,我們通過父元素的`perspective`來定義透視視圖。然後定義了一個立方體的六個面,每一個面通過`transform`屬性來實現不同的3D效果,比如`translateZ`表示沿著z軸平移,`rotateY`表示繞y軸旋轉,`opacity`表示透明度。最後,在父元素的`hover`狀態下,通過`transform`實現了整個立方體的旋轉效果。…

html旅遊網頁制作,用 HTML 和 CSS 實現

html旅遊網頁制作,用 HTML 和 CSS 實現

下面是一個簡單的html旅遊網頁制作示例代碼,使用 HTML 和 CSS 實現頁面樣式和布局。代碼元素解釋:`<!DOCTYPE html>`:文檔類型聲明,告訴瀏覽器當前文檔使用的是 HTML5 規範。`<html>`:HTML 頁面的根元素,包含整個頁面的內容。`<head>`:頁面頭部,包含元數據和其他引用信息。 `<meta>`:用於設置頁面的元數據,如字符集、關鍵詞等。`<title>`:頁面標題,顯示在瀏覽器的標簽欄上。…