Spring Aop的實現原理

2021-10-12 07:14:46 字數 1985 閱讀 4202

**模式。

通過**,可以詳細控制訪問某個或者某類物件的方法,在呼叫這個方法前做前置處理,呼叫這個方法後做後置處理。

在某些情況下,乙個客戶類不想或者不能直接引用乙個委託物件,而**類物件可以在客戶類和委託物件之間起到中介的作用,其特徵是**類和委託類實現相同的介面。

**類除了是客戶類和委託類的中介之外,我們還可以通過給**類增加額外的功能來擴充套件委託類的功能,這樣做我們只需要修改**類而不需要再修改委託類,符合**設計的開閉原則。**類主要負責為委託類預處理訊息、過濾訊息、把訊息**給委託類,以及事後對返回結果的處理等。**類本身並不真正實現服務,而是同過呼叫委託類的相關方法,來提供特定的服務。真正的業務功能還是由委託類來實現,但是可以在業務功能執行的前後加入一些公共的服務。例如我們想給專案加入快取、日誌這些功能,我們就可以使用**類來完成,而沒必要開啟已經封裝好的委託類。

**模式分為靜態**和動態**,靜態**是我們自己建立乙個**類,而動態**是程式自動幫我們生成乙個**。

靜態**:

靜態**需要建立真實角色和**角色,分別實現抽象角色,真實角色可以直接實現,**類需要將真實物件傳進來。

(1).接受真實物件

(2).通過構造方法傳進來真實的物件

總結:

優點:可以做到在符合開閉原則的情況下對目標物件進行功能擴充套件。

缺點:我們得為每乙個服務都得建立**類,工作量太大,不易管理。同時介面一旦發生改變,**類也得相應修改。

動態**:

動態**比靜態**使用的更廣泛,在本質上,動態**的**類不用我們來管,交給工具去生成**類即可。

動態**又分兩種,面向介面的jdk**和面向class位元組碼的cglib**。

我們不需要去建立**類,那我們只需要編寫乙個動態處理器就可以了,真正的**物件由jdk在執行時為我們動態的建立

相對於靜態**,jdk 動態**大大減少了我們的開發任務,同時減少了對業務介面的依賴,降低了耦合度。jdk 動態**是利用反射機制生成乙個實現**介面的匿名類,在呼叫具體方法前第啊用invokehandler來處理。

jdk 動態**的特點:jdk 實現動態**需要實現類通過介面定義業務方法。

對於沒有介面的類,就需要cglib。

原理:通過位元組碼技術為乙個類建立子類,並在子類中採用方法攔截的技術攔截所有父類方法的呼叫,順勢織入橫切邏輯。

採用繼承,不能對final修飾的類進行**

使用cglib需要實現methodinterceptor介面,並重寫intercept方法,在該方法中對原始要執行的方法前後做增強處理。該類的**物件可以使用**中的位元組碼增強器來獲取。 

cglib建立的動態**物件比jdk建立的動態**物件的效能更高,但是cglib建立**物件時所花費的時間卻比jdk多得多。所以對於單例物件,因為無需頻繁建立物件,用cglib合適,反之使用jdk要合適一些。

jdk 動態**和cglib 動態**均是實現spring aop的基礎。 

在spring 5原始碼中:

(1).判斷是否是最優化的,判斷是否是**類,判斷**的物件是否又實現介面。前兩個判斷預設返回false

(2).判斷目標類是否為null,若為null,則丟擲異常 (aopconfigexception) 

(3).判斷目標類是否是介面或者目標類是否是proxy型別,若是則使用jdk動態**

(4).若配置使用cglib進行動態**或者目標類沒有介面,那麼使用cglib的方式建立**物件

(5).若(2)、(3)、(4)方法中沒有乙個為true,那使用jdk的提供的**方式生成**物件。

如果目標物件實現了介面,預設情況下會採用jdk的動態**實現aop;如果目標物件沒有實現介面,則採用cglib庫,spring會自動在jdk動態**和cglib動態**之間轉換。

Spring AOP 實現原理

眾所周知 spring 的aop是基於動態 實現的。從靜態 中可以看出 靜態 只能 乙個具體的類,如果要 乙個介面的多個實現的話需要定義不同的 類。需要解決這個問題就可以用到 jdk 的動態 其中有兩個非常核心的類 proxy類是用於建立 物件,而invocationhandler介面主要你是來處理...

Spring AOP實現原理

動態 1 jdk動態 基於介面的動態 對物件進行 2 cglib動態 基於子類的動態 對類進行 jdk的動態 機制只能 實現了介面的類,而沒有實現介面的類不能實現jdk的動態 1 jdk動態 public inte ce producerdao public class producerdaoimp...

SpringAop原理,SpringMVC過程

spring aop springmvc 這兩個應該是國內面試必問題,網上有很多答案,其實背背就可以。但今天筆者帶大家一起深入淺出原始碼,看看他的原理。以期讓印象更加深刻,面試的時候游刃有餘。簡單說說 aop 的設計 每個 bean 都會被 jdk 或者 cglib 取決於是否有介面。每個 bean...