一、鏈接點(Joinpoint)java
程序執行的某個特定位置:如類開始初始化前、類初始化後、類某個方法調用前、調用後、方法拋出異常後。這些代碼中的特定點,稱爲「鏈接點」。Spring僅支持方法的鏈接點,即僅能在方法調用前、方法調用後、方法拋出異常時以及方法調用先後這些程序執行點織入加強。數據庫
二、切點(Pointcut)框架
每一個程序類都擁有多個鏈接點,如一個擁有兩個方法的類,這兩個方法都是鏈接點。但在這爲數衆多的鏈接點中,如何定位到某個感興趣的鏈接點上呢?AOP經過「切點」定位特定的鏈接點。經過數據庫查詢的概念來理解切點和鏈接點的關係:鏈接點至關於數據庫中的記錄,而切點至關於查詢條件。一個切點能夠匹配多個鏈接點。性能
Spring中,切點經過Pointcut接口進行描述。代理
三、加強(Advice)對象
加強是織入到目標類鏈接點上的一段程序代碼。加強既包含了用於添加到目標鏈接點上的一段執行邏輯,又包含了用於定位鏈接點的方爲信息,因此Spring所提供的加強接口都是帶方位名的:BeforeAdvice(方法調用前的位置)、AfterReturningAdvice(訪問返回後的位置)、ThrowsAdvice等。接口
四、目標對象(Target)get
加強邏輯的織入目標類。編譯器
五、織入(Weaving)io
織入是將加強添加到目標類具體鏈接點上的過程。AOP有三種織入方式:
1)編譯期織入,這要求使用特殊的Java編譯器;
2)類裝載期織入,這要求使用特殊的類裝載器;
3)動態代理織入,在運行期爲目標類添加加強生成子類的方式。
Spring採用動態代理織入,而AspectJ採用編譯期織入和類裝載期織入。
六、切面(Aspect)
切面由切點和加強組成,它既包括了橫切邏輯的定義,也包括了鏈接點的定義,Spring AOP就是負責實施切面的框架,它將切面所定義的橫切邏輯織入到切面所指定的鏈接點中。
AOP的工做重心,主要包括兩個:
1)如何經過切點和加強定位到鏈接點上;
2)如何在加強中編寫切面的代碼。
七、其餘基礎知識
Spring AOP使用了兩種代理機制:一種是基於JDK的動態代理,另外一種是基於CGLib的動態代理。之因此須要兩種代理機制,很大程度上是由於JDK自己只提供接口的代理,而不支持類的代理。
JDK的動態代理主要涉及到java.lang.reflect包中的兩個類:Proxy和InvocationHandler。
CGLib採用很是底層的字節碼技術,能夠爲一個類建立子類,並在子類中採用方法攔截的技術攔截全部父類方法的調用。
有研究代表,CGLib所建立的動態代理對象的性能比JDK的所建立的代理對象的性能高了很多。但CGLib在建立代理對象時所花費的時間卻比JDK動態代理多,因此對於singleton的代理對象或者具備實例池的代理,由於無須頻繁建立代理對象,因此比較適合用CGLib動態代理技術,反之則適合用JDK動態代理技術。 CGLib不能對目標類中的final方法進行代理。