spring-aop組件詳解——Advice通知

        Advice(通知)是面向切面編程中的一個很是重要的概念。咱們都知道,AOP的目的在於對目標類或目標方法的邏輯加強(如:日誌邏輯、統計邏輯、訪問控制邏輯等),那麼Advice就表明要加強的具體邏輯。Advice接口由AOP聯盟(aopalliance.org)定義,它只是一個標記接口,用來強調概念,沒有定義任何功能(或者說沒有定義加強方式或加強內容)。java

Advice體系圖以下:spring

        AOP聯盟在Advice的基礎上擴展定義了子接口——Interceptor(攔截器)。攔截器定義了通知的加強方式,也就是經過對Joinpoint(鏈接點)的攔截。AOP聯盟的原話是這樣的:編程

A generic interceptor can intercept runtime events that occur within a base program. Those events are materialized by (reified in) joinpoints. Runtime joinpoints can be invocations, field access, exceptions...框架

如下是個人翻譯:函數

一個通用的攔截器能夠攔截髮生在基礎程序中的運行時事件。這些事件被鏈接點具體化。運行時鏈接點能夠是一次方法調用、字段訪問、異常產生等等。翻譯

        很明顯,Interceptor接口也在強調概念而非功能,也是一個標記接口。 由Interceptor擴展出的ConstructorInterceptor和MethodInterceptor兩個子接口,才具體定義了攔截方式。它們一個用於攔截構造方法,一個用於攔截普通方法。代碼以下:日誌

public interface ConstructorInterceptor extends Interceptor {

	Object construct(ConstructorInvocation invocation) throws Throwable;
	
}
public interface MethodInterceptor extends Interceptor {
	
    Object invoke(MethodInvocation invocation) throws Throwable;
   
}

        可是,spring框架並無支持AOP聯盟對構造方法的攔截,緣由很簡單,spring框架自己,經過BeanPostProcessor的定義,對bean的生命週期擴展已經很充分了。code

        MethodInterceptor只定義了加強方式,咱們能夠經過實現此接口,自定義具體的加強內容。固然,spring框架也提供了3種預約義的加強內容——BeforeAdvice(前置通知)、AfterAdvice(後置通知)和DynamicIntroductionAdvice(動態引介通知)。BeforeAdvice和AfterAdvice更確切地說是定義了加強內容的執行時機(方法調用以前仍是以後);而DynamicIntroductionAdvice比較特殊,它能夠編輯目標類要實現的接口列表。最後,spring預約義的通知仍是要經過對應的適配器,適配成MethodInterceptor接口類型的對象(如:MethodBeforeAdviceInterceptor負責適配MethodBeforeAdvice)。對象

        既然MethodInterceptor是核心,那麼下面重點介紹如下MethodInterceptor的體系,以下圖:接口

重點介紹幾個經常使用攔截器(其餘的讀者可自行研究):

  1. MethodBeforeAdviceInterceptor:
            MethodBeforeAdvice(前置通知,其父接口是BeforeAdvice)接口的適配器,用於支持spring預約義的前置通知,在目標方法調用前調用MethodBeforeAdvice.before()。
  2. AspectJAfterAdvice :
            AspectJ框架的後置通知實現,在目標方法執行結束後,return以前,調用配置指定的方法(注意:此方法調用被寫在finally塊中,不管如何都會獲得執行)。
  3. AfterReturningAdviceInterceptor :
            AfterReturningAdvice接口的適配器,用於支持spring預約義的後置通知,在目標方法執行結束後,return以前,調用AfterReturningAdvice.afterReturning()執行(注意:若是目標方法拋出異常,則不會執行這個方法)。
  4. AspectJAfterThrowingAdvice :
            AspectJ框架的異常通知,當目標方法執行時產生異常的時候,指定配置指定的方法。
  5. AspectJAroundAdvice :
            AspectJ框架的環繞通知,直接執行配置指定的方法。
  6. ThrowsAdviceInterceptor :
            spring框架預約義的異常通知的適配器,此適配器接受任意類型的對象,可是要求對象所在類必須聲明public的名稱爲afterThrowing,且參數個數爲1個或4個,且最後一個參數爲Throwable類型的方法。該適配器會保存該Throwable對象的實際類型到該方法之間的映射,當目標方法執行產生異常時,根據產生的異常類型找到對應的通知方法進行調用。
  7. DelegatingIntroductionInterceptor :
            經過構造方法傳入指定的引介對象,每當調用的目標方法是引介接口定義的方法時,都會調用該引介對象的對應方法。
  8. DelegatePerTargetObjectIntroductionInterceptor :         經過構造函數傳入指定的引介接口和接口對應的實現類,該攔截器會爲每一個目標對象建立新的引介對象(經過調用實現類的默認無參構造)。當調用的方法是引介接口定義的方法時,則調用該新建的引介對象對應的方法。
相關文章
相關標籤/搜索