spring aop ,springmvc ,這兩個應該是國內面試必問題,網上有很多答案,其實背背就可以。但今天筆者帶大家一起深入淺出原始碼,看看他的原理。以期讓印象更加深刻,面試的時候游刃有餘。
簡單說說 aop 的設計:
每個 bean 都會被 jdk 或者 cglib **。取決於是否有介面。
每個 bean 會有多個「方法***」。注意:***分為兩層,外層由 spring 核心控制流程,內層***是使用者設定,也就是 aop。
當**方法被呼叫時,先經過外層***,外層***根據方法的各種資訊判斷該方法應該執行哪些「內層***」。內層***的設計就是職責連的設計。
是不是賊簡單。
看完之後更簡單。
可以將 aop 分成 2 個部分來扯,哦,不,來分析。。。 第一:**的建立; 第二:**的呼叫。
注意:我們盡量少貼**,盡量用文字敘述,因為面試的時候,也是文字敘述,不可能讓你把**翻出來的。。。所以,這裡需要保持一定的簡潔,想知道細節,看 inte***ce 21 原始碼,想知道的更細,看 spring framework 最新的 master 分支**。
**位置:com.inte***ce21.aop 包下。
開始分析(扯):
**的建立(按步驟):
**的呼叫
題外話:spring 的事務也就是個***。
來張不是很標準的 uml 圖:
關於呼叫過程,來張流程圖:
大概就是這樣子,具體更多的細節,請看原始碼,如果還不是很明白的話,請諮詢本人,本人不確定這個圖是否畫的很淺顯易懂 —— 最起碼萌新看得懂才能稱之為淺顯易懂。
先來張圖:
**位置:com.inte***ce21.web.servlet.dispatcherservlet#doservice
(沒錯,就是 spring 1.0 的**,大道至簡,現在的 spring 經過 15 年的發展,已經太過臃腫,從學習角度來說,inte***ce 21 是最好的**,不接受反駁)
**如下:
1. 設定屬性
request.setattribute(locale_resolver_attribute, this.localeresolver);
request.setattribute(theme_resolver_attribute, this.themeresolver);
2. 根據 request 請求的 url 得到對應的 handler 執行鏈,其實就是***和 controller **物件。
3. 得到 handler 的介面卡也就說說,如果你想要在處理 handler 之前做一些操作的話,可能需要這個,即適配一下這個 handler。例如 spring 的測試程式做的那樣:4. 迴圈執行 handler 的 pre ***}
} 這個沒什麼好講的吧?
5. 執行真正的 handler,並返回 modelandview(handler 是個**物件,可能會執行 aop )
6. 迴圈執行 handler 的 post ***
}7. 根據 modelandview 資訊得到 view 例項
view view = null;if (mv.isreference())
8. 渲染 view 返回
view.render(mv.getmodel(), request, response);
Spring AOP 實現原理
眾所周知 spring 的aop是基於動態 實現的。從靜態 中可以看出 靜態 只能 乙個具體的類,如果要 乙個介面的多個實現的話需要定義不同的 類。需要解決這個問題就可以用到 jdk 的動態 其中有兩個非常核心的類 proxy類是用於建立 物件,而invocationhandler介面主要你是來處理...
Spring AOP實現原理
動態 1 jdk動態 基於介面的動態 對物件進行 2 cglib動態 基於子類的動態 對類進行 jdk的動態 機制只能 實現了介面的類,而沒有實現介面的類不能實現jdk的動態 1 jdk動態 public inte ce producerdao public class producerdaoimp...
Spring Aop的實現原理
模式。通過 可以詳細控制訪問某個或者某類物件的方法,在呼叫這個方法前做前置處理,呼叫這個方法後做後置處理。在某些情況下,乙個客戶類不想或者不能直接引用乙個委託物件,而 類物件可以在客戶類和委託物件之間起到中介的作用,其特徵是 類和委託類實現相同的介面。類除了是客戶類和委託類的中介之外,我們還可以通過...