Spring AOP面向切面程式設計

2021-07-02 07:38:45 字數 3544 閱讀 2498

最近在系統中需要實現使用者某些操作新增積分, 希望實現對系統現有的**進行最小嵌入,因此使用spring aop的切面程式設計將很好實現該需求,達到最小耦合度。在spring aop中的通知都是針對方法層級進行通知,相對與struct中針對類層級通知,具有更好的靈活性。

/*方法攔截*/

methodinterceptor

/*返回攔截*/

afterreturningadvice

/*事件攔截*/

handlerinterceptor

methodinvocation

1、經典的基於**的aop(各版本spring)

2、@aspectj註解驅動的切面(僅spring 2.0);

3、純pojo切面(僅spring2.0);

4、注入式aspectj切面(各版本spring)

前三種都是基於**的aop的變體,因此,spring對aop的支援侷限於方法注入。如果我們的aop需求超過了簡單方法注入的範疇(比如構造器或屬性注入),就應該考慮在aspectj裡實現切面,利用spring的從屬注入把spring的bean注入到aspectj切面

1、before advice 在方法執行前執行。

2、after returning advice 在方法執行後返回乙個結果後執行

3、after throwing advice 在方法執行過程中丟擲異常後執行

4、around advuce 綜合執行以上三種情況

1、建立通知:實現通知的這幾個介面,並實現其中的方法

a)org.springframework.aop.methodbeforeadvice

b)org.springframework.aop.afterreturningadvice

c)org.springframework.aop.throwsadvice

d)org.aopalliance.intercept.methodinterceptor

e)org.springframework.aop.introductioninterceptor

2、定義切點和通知者:在spring配製檔案中配置這些資訊

3、使用proxyfactorybean來生成**

要想實現spring aop  僅僅針對某一指定的方法進行切面程式設計,而不是針對所有的方法進行切面程式設計,那麼需要指定切入點(pointcut) ,pointcut通過制定方法名進行攔截方法,同時pointcut必須advisor進行關聯。pointcut可以通過指定完全方法名或通過正規表示式進行匹配方法。

org.springframework.aop.support.namematchmethodpointcut:表示該切點通過直接通過完全方法名匹配方法的,property中的value就是完整的方法名。

結合通知者advisor

org.springframework.aop.support.defaultpointcutadvisor是個通知者類,他只是把通知關聯給切入點

聯合切入點是比較特殊的正規表示式切入點,他同時結合了切入點和通知者

.*insertteststudent

從aspectj裡定義切點的方式就可以看出aspectj的切點語言是一種真正的切點表達語言。 類org.springframework.aop.aspectj.aspectjexpressionpointcut被用來定義aspectj切點表示式

通過使用defaultpointcutadvisor把切入點和通知者結合起來。我們可以利用特殊的通知者,把切點表示式定義為通知者的乙個屬性。對於aspectj表示式來說,使用的通知者類是org.springframework.aop.aspectj.aspectjexpressionpointcutadvisor:

通知者把通知與切點關聯起來,從而完整地定義乙個切面。

切面在spring裡是以**方式實現的,所以仍然需要**目標bean才能讓通知者發揮作用,以下有兩種方式顯示**,一通過proxyfactorybean方式或者通過自動**。

guidestudentservice

addguideintegralaftertesting

spring的proxyfactorybean是個工廠bean,用於生成乙個**,把乙個或多個通知者應用到bean

audienceadvisor

自動**能夠讓切面的切點定義來決定哪個bean需要**,不需要我們為特定的bean明確地建立**,從而提供了乙個更完整的aop實現。實現自動**bean的方式有兩種:

1、基於spring上下文裡宣告的通知者bean的基本自動**」:通知者的切點表示式用於決定哪個bean和哪個方法要被**。

2、基於@aspectj註解驅動切面的自動**」:切面裡包含的通知裡指定的切點將用於選擇哪個bean和哪個方法要被**。

guidestudentservice

addguideintegralaftertesting

.*insertteststudent

guidestudentservice

addguideintegralaftertesting

切面的功能被稱為advice(通知),定義切面的工作內容,以及切面工作的時機,實在被攔截方法之前,之後,異常丟擲時,還是以上情況都執行。

joinpoint就是程式執行過程中能夠插入到切面的乙個點,這個點就是方法被呼叫時,異常丟擲時,甚至欄位被編輯時。切面**通過這個點插入到程式的一般流程中,從而新增新的行為。

pointcut作用就是縮小切面通知範圍

切入點可以縮小切面通知的連線點的範圍。如果說advice定義了切面的「什麼」和「何時」,那麼切入點就定義了「何地」。切入點的定義匹配advice要織入的乙個或多個連線點。我們通常使用明確的類和方法名稱,或是利用正規表示式定義匹配的類和方法名稱模板來指定這些切入點。有些aop框架允許建立動態切入點,可以根據執行時的狀態(比如方法的引數值)來應用通知。

切面就是通知和切入點的結合。通知和切入點共同定義了關於切面的全部內容——它的功能、在何時和何地完成其功能。

「目標」是被通知的物件,它可以是我們編寫的乙個物件,或第三方物件。如果沒有aop,這個物件就必須包含自己的主要邏輯和交叉事務的邏輯。通過使用aop,目標物件就可以著重於自己的主要邏輯,不必考慮要被應用的任何通知。

**是向目標物件應用通知之後被建立的物件。對於客戶物件來說,目標物件(aop之前)和**物件(aop之後)是一樣的——它們就應用是這樣的。這樣一來,程式的其他部分就不必修改對**物件的支援。

織入是把切面應用到目標物件來建立新的**物件的過程。切面在指定連線點織入到目標物件。在目標物件的生命週期裡有多個時機可以發生織入過程:

Spring AOP 面向切面程式設計

spring aop aop aspect orient programming 也就是面向切面程式設計 可以這樣理解,物件導向程式設計 oop 是從靜態角度考慮程式結構,面向切面程式設計 aop 是從動態角度考慮程式執行過程。在日常生活中,會遇到各種各樣的中介機構,比如獵頭公司,律師事務所,婚姻介...

Spring AOP面向切面程式設計

一.常用概念 原有功能 切點 pointcut 前置通知 在切點之前執行的功能,before advice 後置通知 在切點之後執行的功能,after advice 異常通知 如果切點執行過程 現異常,則觸發異常通知 throws advice 切面 所有功能的總稱 織入 把切面嵌入到原有功能的過程...

Spring AOP 面向切面程式設計)

aop能夠將那些與業務無關,卻為業務模組所共同呼叫的邏輯或責任 例如事務處理 日誌管理 許可權控制等 封裝起來,便於減少系統的重複 降低模組間的耦合度,並有利於未來的可拓展性和可維護性。簡單例子 在某個專案裡,非管理員不能對某些業務進行操作,如下 從上面的 我們可以看出這種方式達到了許可權驗證的功能...