Spring學習之深入AOP面向切面程式設計

2021-06-04 12:02:15 字數 2542 閱讀 6525

1、aop基本概念術語。切面、通知、切入點、引入、**、織入。

切面,是指需要實現的交叉功能。是應用系統模組化的乙個俄切面或領域。切面最常見的例子是日誌記錄。乙個系統到處都需要日誌記錄,利用切面就能不侵入的情況下實現該功能。其實切面就是包含定義切面行為的通知和定義切面在什麼地方織入的切入點組成。

通知,就是切面的具體實現,通知將應用系統新的行為加入到系統中。比如在日誌例子中,日誌通知包含了實現實際日誌功能的**,例如想日誌檔案寫入日誌,這個具體的行為就是通知。

切入點,定義了通知應該應用在那些地方,通知可以應用到系統的任何乙個地方,如果想要過濾一些不想通知的地方,就要用到切入點,用來定義切面在什麼地方切入。

引入,允許為已存在類新增新的方法和屬性。例如,可以常見乙個稽查通知來記錄物件的最後修改時間。只要用乙個方法setlastmodified記憶乙個儲存狀態的變數。可以在不改變已存在類的情況下將這個方法與變數引用,給他們新的行為和封裝。即可以讓已存在的類實現乙個類,並實現其中的方法,從而用新的行為。

**,將通知應用到目標物件後建立的物件,對和客戶而言,目標物件(應用aop之前的物件)和**物件(應用aop之後的物件)是一樣的。就是**真實主題,系統其他部分不用為了**物件而改變。 

織入,就是i將切面應用到目標物件從而建立乙個新的**物件的過程。

切面在指定連線點織入到目標物件中。

2、通知advice。spring可以在多個地方織入通知,所以有多種型別。beforeadvice前置通知,afterreturningadivce後置通知,afterthrowingadvice異常通知,aroundadice環繞通知,introductionadvice引入通知。前置通知介面的乙個實現:methodbeforeadvice,其中有個方法如下:

void before(method method,object  args, object target);
**工廠的配置**如下:
後置通知和前置通知差不多一樣的配置和是吸納方法。

環繞通知比較特殊,有兩個特殊的地方,1)該介面methodinterceptor 能控制目標方法是否真被呼叫,可以通過methodincovation.proceed()方法來呼叫目標方法,這一點不同於methodbeforeadvice,目標方法總是被呼叫,除非丟擲異常。2)methodinterceptor可以控制返回的物件,也就是說可以返回乙個與proceed()方法返回的物件完全不同的物件。而是用afterreturningadvice則不能返回乙個不同的物件。

異常通知throwableadivice是用來處理在方法呼叫過程中產生的錯誤或異常。

引入通知introductioninterceptor,可以進行混合業務邏輯,可以在原有的類的基礎上進行擴充套件。例如在原有的people類中引入記錄執行時間的功能。**如下:

public class executetimeimpl implements interductioninterceptor, executetimeinte***ce

public object invoke(methodinvocation m) throws throwable

public void printexecutetime()

}

這樣就在原來的基礎上加入了記錄時間的方法,對原有的類沒進行修改,不造成影響。

3、切入點pointcut。切入點可以確定在什麼地方將通知織入到目標類中。spring通過org.springframework.aop.pointcut介面描述切點,該介面由classfilter和methodmatcher構成。即pointcut有兩個方法:getclassfilter(), getmethodmatcher()。分別進行類過濾和方法過濾。類過濾:classfiler介面僅有乙個方法boolean matcher(class clazz);用於過濾類,匹配過濾條件則返回true。方法過濾:methodmatcher介面有三個方法,boolean isruntime(),判斷methodmatcher的型別是靜態的還是動態的。boolean matches(method method, class targetclass); 用來過濾方法。

4、切面advisor。切面是由通知和切點組成的。切面分為一般切面,切點切面和引入切面,較常用的是切點切面。靜態切入點的實現類的乙個例子如下所示:

public class peopleadvisor extends staticmethodmatcherpointcutadvisor 

public classfilter getclassfilter()

};}}

配置如下:

spring學習之AOP 三

四個bean定義的次序並不重要。我們現在有了乙個advice,乙個包含了正規表示式pointcut的advisor,乙個主程式類和乙個配置好的介面,通過工廠ctx,這個介面返回自己本身實現的乙個引用。beanimpl和testbeforeadvice都是直接配置。我們用乙個唯一的id建立乙個bean...

Spring學習日記(二)AOP的深入操作

上次的aop操作簡單,但對初學者而言,刪繁就簡地體現了aop的設計思想。但有些過於簡化了,本次將把引數帶入到aop的操作中。1 修改切面處理類 改寫servicebefore 使其含有引數 public void servicebefore2 object arg 2 修改配置檔案 切入點表示式 3...

Spring學習筆記 AOP

1 匯入aop模組 spring aop spring aspects 2 定義乙個業務邏輯 3 定義乙個日誌切面類 通知方法 前置通知 before 在目標方法執行之前執行 後置通知 after 在目標方法執行結束後執行 返回通知 afterrerurning 在目標方法正常返回之後執行 異常通知...