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的體系,以下圖:接口
重點介紹幾個經常使用攔截器(其餘的讀者可自行研究):