spring AOP-----總體概念

靜態AOP 時代:

其特點是,相應的橫切關注點以Aspect形式實現之後,會通過特定的編譯器,將實現後的Aspect編譯並織入到系統的靜態類中。優點是,Aspect直接以java 字節碼的形式編譯到Java 類中,java虛擬機可以像通常一樣加載java類運行(因爲編譯完成的Aspect是完全符合java類的規範的),不會對整個系統的運行造成任何的性能損失。缺點就是不靈活,如果橫切面關注點需要改變織入到系統的位置,就需要重新修改Aspect 定義文件,然後使用編譯器重新編譯Aspect並重新織入到系統中。

動態AOP 時代:

大都採用java 語言實現,AOP的織入過程在系統運行開始之後進行,而不是預先編譯到系統中,而且織入信息大都採用外部XML文件格式保存,可以在調整織入點以及織入邏輯單元的同時,不必變更系統其他模塊甚至在系統運行時,動態改變織入邏輯。

Java平臺上的AOP實現機制:

常用方式:

動態代理(Dynamic Proxy)機制:可以在運行期間,爲相應的接口(Interface)動態生成對應的代理對象。我們可以將橫切關注點邏輯封裝到動態代理的InvocationHandler中,然後在系統運行期間,根據橫切關注點需要織入的模塊位置,將橫切邏輯織入到相應的代理類中,以動態代理爲載體的橫切邏輯,就可以與系統其他模塊一起工作了。優點或者缺點:所有需要織入橫切關注點邏輯的模塊都得實現相應的接口,因爲動態代理機制只針對接口有效。【動態代理是在運行期間使用反射,相對編譯後的靜態類的執行,性能上要稍微差一點】

動態字節碼增強:爲需要織入橫切邏輯的模塊類在運行期間,通過動態字節碼增強技術,爲這些系統模塊類生成相應的子類,將橫切邏輯加到這些子類中,讓應用程序在執行期間使用的是這些動態生成的子類,從而達到將橫切邏輯織入系統的目的。優點即使模塊類沒有實現相應的接口,依然可以對其進行擴展,缺點就是如果需要擴展的類或者類中的方法聲明爲final 的話,則無法對其子類化的擴展。

自定義類加載器:所有的java 程序的class 都要通過相應的類加載器(Classloader)加載到Java虛擬機之後纔可以運行。默認的類加載器會讀取class字節碼文件,然後按照class字節碼規範,解析並加載這些class文件到虛擬機運行。如果能夠在這個class文件加載到虛擬機運行期間,將橫切邏輯織入到class文件也可以的。

AOP的幾個公民:

JoinPoint:在系統運行之前,AOP的功能模塊都需要織入到oop的功能模塊中。所以,要進行這種織入過程,我們需要知道在系統的哪些執行點上進行織入操作,這些將要在其之上進行織入操作的系統執行點就稱之爲Joinpoint。常用的joinPoint類型爲方法級別的調用(Method Call)方法調用執行(Method Call execution)構造方法執行,字段設置/獲取(set/get)異常處理執行,類初始化。

PointCut:代表的是Joinpoint 的表述方式。將橫切邏輯織入到當前系統的過程中,需要參照PointCut規定的Joinpoint信息,纔可以知道應該往系統的哪些Jointpoint上織入橫切邏輯。

Advice:是單一的橫切關注點邏輯的載體,他代表將會織入到Jointpoint的橫切邏輯。

Aspect:是對系統中的橫切關注點邏輯進行模塊化封裝的AOP概念實體。通常情況下,Aspect可以包含多個Pointcut以及相關Advice定義。

織入和織入器:只有經過織入過程之後,以Aspect 模塊化的橫切關注點纔會集中成到OOP的現存系統中。

目標對象:符合Pointcut所指定的條件,將在織入過程中被織入橫切邏輯的對象,稱爲目標對象。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章