小引:
如果安裝了Java的反編譯工具,可以反編譯上篇文章中的Hello.class檔案,我們將會發現該Hello.class檔案不是由Hello.java檔案編譯得到的,該Hello.class裡新增了很多內容------這表明AspectJ在編譯時間已增強了Hello.class類的功能,因此
AspectJ 通常被稱為編譯時間增強AOP架構。
與AspectJ相對的還有另外一種AOP架構,它們不需要在①編譯時間對目標類進行增強,而是②運行時產生目標類的代理類,該代理類要麼與目標類實現相同的介面,要麼是目標類的子類------總之,代理類都對目標類進行了增強處理,前者是JDK動態代理的處理策略,後者是CGLIB代理的處理策略。
Spring AOP以建立動態代理的方式來組建代理程式類,底層既可使用JDK動態代理,也可採用CGLIB代理。
一般來說,編譯時間增強AOP架構在效能上更有優勢------因為運行時動態增強AOP架構需要每次運行時都進行動態增強。
AOP的基本概念:
AOP從程式運行角度考慮程式的流程,提取業務處理過程的切面。AOP面向的是程式運行中各個步驟,希望以更好的方式來組合業務處理的各個步驟。
AOP架構並不與特定的代碼耦合,AOP架構能處理常式執行中特定切入點(Pointcut),而不與某個具體類別結合程度。AOP架構具有如下兩個特徵:
① 各步驟之間的良好隔離性。
② 原始碼無關性。
下面是關於面向切面編程的一些術語:
① 切面(Aspect):商務程序啟動並執行某個特定步驟,也就是應用運行過程的關注點,關注點可能橫切多個對象,所以常常也稱為橫切關注點。
② 連接點(Joinpoint):程式執行過程中明確的點,如方法的調用或者異常的拋出。Spring AOP中,連接點總是方法的調用。
③ 增強處理(Advice):AOP架構在特定的切入點執行的增強處理。處理有around,before,after等類型。
④ 切入點(Pointcut):可以插入增強處理的連接點。簡而言之,當某個連接點滿足指定要求時,該連接點將被添加增強處理,該連接點也就變成了切入點。例如如下代碼:
pointcut xxxPointcut() :execution(void H*.say*())
每個方法被調用都只是連接點,但如果該方法屬於H開頭的類,且方法名義say開頭,那麼該方法的調用執行將變成切入點。如何使用運算式來定義切入點是AOP的核心,Spring預設使用AspectJ切入點文法:
① 引入:將方法或欄位添加到被處理的類中。Spring允許引入新的介面到任何被處理的對象。例如你可以使用一個引入,使任何對象實現isModified介面,以此來簡化緩衝。
② 目標對象:被AOP架構進行增強處理的對象,也被稱為被增強對象。如果AOP架構是通過運行時代理來實現的,那麼這個對象將是一個被代理的對象。
③ AOP代理:AOP架構建立的對象,簡單地說,代理就是對目標對象的加強。Spring中的AOP代理可以是JDK動態代理,也可以是CGLIB代理。前者為實現介面的目標對象的代理,後者為不實現介面的目標對象的代理。
④ 織入(Weaving):將增強處理添加到目標對象中,並建立一個被增強對象(AOP代理)的過程就是織入。織入有兩種實現方式:編譯時間增強(例如AspectJ)和運行時增強(例如CGLIB)。Spring和其他純Java AOP架構一樣,在運行時完成織入。
由前面的介紹知道:AOP代理其實是由AOP架構動態產生的一個對象,該對象可作為目標對象使用。AOP代理包含了目標對象的全部方法,但AOP代理中的方法與目標對象的方法存在差異:AOP方法在特定切入點添加了增強處理,並且回調了目標對象的方法。
AOP代理所包含的方法與目標對象的方法如下: