1. 程式人生 > >再談Spring AOP

再談Spring AOP

ces 代理模式 urn 目標 all ati ron 之前 後置

1、AOP的基本概念

在進行AOP開發前,先熟悉幾個概念:

連接點(Jointpoint):表示需要在程序中插入橫切關註點的擴展點,連接點可能是類初始化、方法執行、方法調用、字段調用或處理異常等等,Spring只支持方法執行連接點,AOP中表示為“在哪裏幹”

切入點(Pointcut):選擇一組相關連接點的模式,即可以認為連接點的集合,Spring支持perl5正則表達式和AspectJ切入點模式,Spring默認使用AspectJ語法,AOP中表示為“在哪裏幹的集合”

通知(Advice):在連接點上執行的行為,通知提供了在AOP中需要在切入點所選擇的連接點處進行擴展現有行為的手段;包括前置通知(before advice)、後置通知(after advice)、環繞通知(around advice),在Spring中通過代理模式實現AOP,並通過攔截器模式以環繞連接點的攔截器鏈織入通知;

AOP中表示為“幹什麽”;

方面/切面(Aspect):橫切關註點的模塊化,比如上邊提到的日誌組件。可以認為是通知、引入和切入點的組合;在Spring中可以使用Schema和@AspectJ方式進行組織實現;AOP中表示為“在哪幹和幹什麽集合”;

引入(inter-type declaration):也稱為內部類型聲明,為已有的類添加額外新的字段或方法,Spring允許引入新的接口(必須對應一個實現)到所有被代理對象(目標對象), 在AOP中表示為“幹什麽(引入什麽)”

目標對象(Target Object):需要被織入橫切關註點的對象,即該對象是切入點選擇的對象,需要被通知的對象,從而也可稱為“被通知對象”;由於Spring AOP 通過代理模式實現,從而這個對象永遠是被代理對象,

AOP中表示為“對誰幹”

AOP代理(AOP Proxy):AOP框架使用代理模式創建的對象,從而實現在連接點處插入通知(即應用切面),就是通過代理來對目標對象應用切面。在Spring中,AOP代理可以用JDK動態代理或CGLIB代理實現,而通過攔截器模型應用切面。

織入(Weaving):織入是一個過程,是將切面應用到目標對象從而創建出AOP代理對象的過程,織入可以在編譯期、類裝載期、運行期進行。

在AOP中,通過切入點選擇目標對象的連接點,然後在目標對象的相應連接點處織入通知,而切入點和通知就是切面(橫切關註點),而在目標對象連接點處應用切面的實現方式是通過AOP代理對象,如下圖所示。

技術分享圖片

接下來再讓我們具體看看Spring有哪些通知類型:

1. 前置通知(Before Advice):在切入點選擇的連接點處的方法之前執行的通知,該通知不影響正常程序執行流程(除非該通知拋出異常,該異常將中斷當前方法鏈的執行而返回)。

2. 後置通知(After Advice):在切入點選擇的連接點處的方法之後執行的通知,包括如下類型的後置通知

  2.1 後置返回通知(After returning Advice):在切入點選擇的連接點處的方法正常執行完畢時執行的通知,必須是連接點處的方法沒拋出任何異常正常返回時才調用後置通知

2.2 後置異常通知(After throwing Advice): 在切入點選擇的連接點處的方法拋出異常返回時執行的通知,必須是連接點處的方法拋出任何異常返回時才調用異常通知

2.3 後置最終通知(After finally Advice): 在切入點選擇的連接點處的方法返回時執行的通知,不管拋沒拋出異常都執行,類似於Java中的finally塊。

3. 環繞通知(Around Advices):環繞著在切入點選擇的連接點處的方法所執行的通知,環繞通知可以在方法調用之前和之後自定義任何行為,並且可以決定是否執行連接點處的方法、替換返回值、拋出異常等等。

再談Spring AOP