Spring框架總結之面向切面(一)

Spring框架總結之面向切面(一)

 

AOP(Aspect Oriented Programming),稱之爲“面向切面編程”,它是Spring框架的又一核心模塊,與其支持的DI功能同樣處於重要地位。相比於Java傳統的繼承體系(柱體體系結構),AOP則實現了橫向切割程序生產線,產生若干切面體,而每個切面體含有特定的橫切動作、目標對象及觸發動作的契機點,觸發之後,在橫向實現了各種方式的非業務相關的動作,將業務和非業務模塊分離,一般用來處理日誌、緩存、事務及其它非業務通用部分功能。而AOP的實現機制,實際上是通過代理方式實現,那麼接下來從AOP的基本原理、實現方式、橫切時機及切點表達式四方面介紹,後續文章會以實例詳細介紹AOP的使用。

 

l  AOP基本原理

l  AOP實現方式

l  AOP橫切時機

l  AOP切點表達式

 

 

一、AOP基本原理

正如上圖所示,我們使用約定熟成的幾個術語來形象地描述AOP的基本原理及構成。我們知道Spring的AOP機制是基於代理(Proxy)實現的,也就是面向切面編程中的切面(Aspect)是嵌入或由代理對象來實現,而最終需要把切面織入到目標對象(Bean)中,待該Bean中的某些條件滿足時,採取執行指定的橫切行爲。

如上圖,我們知道Aspect是由通知(Advice)和切入點(Pointcut)共同組成,前者描述了通知的內容和行爲,後者則來控制有哪些鏈接點(Join point)能夠匹配切面的條件,而這些連接點一般位於目標對象中已存在的動作標誌,如:方法、屬性域及構造器等。當應用程序的某些Bean被實例化後,AOP會將相關的Proxy實現的Aspect織入到該Bean中,待它滿足條件被觸發時,即會執行織入其中的切面行爲,將某點的行爲邏輯,橫切出當前應用線程,開闢一新的線程來完成相關的AOP功能,這就是AOP的基本原理。

 

 

二、AOP實現方式

我們知道,不是所有的AOP框架都相同的,它們在連接點模型上可能有強弱之分。有些允許在字段區域,有些則只支持在方法上的連接點支持,而它們織入切面的方式和時機也不同。但不管怎樣,創建切點來定義切面所織入的連接點是AOP框架的基本功能。

 

在Spring中,提供了4種類型的AOP支持,它們分別爲:基於代理的經典Spring AOP、POJO切面、基於Aspect註解切面及注入式AspectJ切面。前三者爲Spring AOP實現的變體,而Spring AOP構建在動態代理基礎之上,所以它僅侷限在對方法的攔截實現。

 

對於第1種aop,這裏不做詳細介紹,因爲它直接使用ProxyFactory Bean,操作繁瑣並且性能比較差;

 

對於第2種aop,它藉助於Spring的aop命名空間,將純POJO對象轉爲切面。而這些切面只提供了滿足切點條件時所調用的方法,並且需要在 xml中聲明實現,方式比較單一。

 

對於第3種aop,Spring藉助了AspectJ的切面實現,以提供註解驅動的切面。實際上,它依然是Spring基於代理方式的AOP,只是編程模式與成熟的AspectJ註解切面相同,它不需要使用xml來實現。

 

對於第4中aop,如果我們需要不僅僅在方法上攔截動作,還需要在屬性和構造方法中攔截,那麼就需要使用這種方式。大多情況下,AspectJ註解切面與Spring的AOP相互獨立,我們可以單單使用AspectJ註解來實現Aop的功能,不需要藉助Spring,但這裏我們討論的是Spring,所以這裏主要介紹第2、3種的實現,對於AspectJ的AOP,這裏不做詳細介紹。

 

 

三、AOP橫切時機

在Spring的AOP中,最爲常用的橫切時機共4種,分別爲切點執行前(@Before)、切點執行後(@After及@AfterReturing)、拋出異常時(@AfterThrowing)、環繞通知(@Round)及它們的結合體。

 

1、@Before

在連接點動作執行之前執行的橫切邏輯行爲。

 

2、@After及@AfterReturing

在連接點動作執行之後執行的橫切邏輯行爲,不同的是@After沒有返回值,而@AfterReturning有返回值。

 

3、@AfterThrowing

在連接點動作執行之後,觸發異常動作時,觸發的動作,常用來解決異常信息的捕獲及處理。

 

4、@Round

在連接點動作執行前、後及異常時都發生,也就是包括了前面三種類型動作的橫切行爲。

 

 

默認情況下,Spring AOP並未被啓用,我們需要開啓它。因爲Spring AOP基於代理實現,所以Spring提供了自動代理開關來開啓AOP,具體在後續文章會羅列出來,這裏不贅述。

 

 

四、AOP切點表達式

1、切點表達式

 

如上圖所示,具體內容請參看圖中說明。

 

2、切面定義樣例

這裏以Spring Aspect註解AOP聲明爲例來定義aop,這個例子只是演示聲明,並無實際意義,具體如下:

 

@Aspect

public class AopTest {

    

     @Before("execution(** com.aop.utils.test1(..))")

     public void test1() {

          // TODO

     }

    

     @AfterReturning("execution(**com.aop.utils.test2(..))")

     public void test2() {

          // TODO

     }

    

     @AfterThrowing("execution(**com.aop.utils.test3(..))")

     public void test3() {

          // TODO

     }

    

}

 

 

 

 

 

 

好了,本篇就介紹這裏,後續文章將繼續總結Spring的AOP實現及各個細節的詳細實現。由於作者水平有限,請在評論或(QQ: 245389109)不吝賜教,謝謝。

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章