Aspect-Oriented Architectures


1.AOP基本概念


    AOP無非就是Weave(織入)什么,在哪里Weave,以及什么和哪里之間如何互相作用,這里的什么就引出了Advice(通知)這個術語,而哪里就引出了pointcut(切入點)這個概念(pointcut是由一組joinpoint連接點組成).而所謂的aspect(方面)就是把advice映射到pointcut上.也就是avice和pointcut之間如何相互作用。


Advice(通知)

    Adivce(通知)就是指定在連接點(joinpoint)做什么,比如Transactions(事務)、Security(安全)、Performance optimization(性能優化)、Error Handling(錯誤處理)、Logging,debugging(日志和調試)等。


Pointcut(切點)

    切點(pointcut)就是用來確定應該在哪里使用avice(通知),切點(pointcut)由一組連接點(jointpoint)組成(a set of joinpoints)。這些點包括:
*    Class names(類名)
*    Interfaces(接口)
*    Method names(方法名)
*    Attributes(屬性)


Aspect(方面)

   
Aspect(方面)就是映射avice(通知)到切入點之上(Maps advice to pointcut),使用下面的方法:
 1.Apply this interceptor to these methods (應用這些攔截器到方法中)
 2.Introduce these methods to these classes(引入這些方法到class中去)
.

由此而引出了兩個新的概念攔截器(interceptor)和引入(Introduction),而這兩個概念就是advice(通知)的一種實現,使其在pointcut上產生作用。


Interceptor(攔截器)

   
攔截器就是在調用者和被調用者之間注入一些行為,它們是透明的。一般使用裝飾器/代理模式(Decorator/Proxy pattern)。
攔截的事件包括:
    Method invocation(方法調用)
    Object construction(對象構造)
    Field access(Field訪問)


Introduction(引入)

   
Introduction(引入)是一種mixin(混合)的方式,向class中添加:
*    Interfaces(接口)
*    Methods(方法)
*    Fields(值域)



2.AOP實現

關于AOP架構,AOP聯盟提出的一個典型的三層架構(可以參考上篇翻譯的文章Why Did We Get In?),可分為:
l  一個low-level層:提供基本的組件實現目標平臺的weaving(AOP主要過程)
2.一個 high-level層
3.一個development-level層

而其中Low-level組件是最重要的,因為整個的AOE(Aspect Oriented Environnments)依賴于它的實現,組件實現的方式是至關緊要的,可能徹底的影響系統屬性,比如性能,可擴展性,集成能力,安全等.

所以下面我們關注一下low-level層的各種Weave方式。


2.1.各個Weave時期的優缺點:


編譯時Weave


優點:直觀,支持最多種類的連接點.
缺點:需要提供所有源代碼.(特別對于模塊化項目,需要所有模塊源代碼),程序不能增量編譯,編譯時間變慢.


后編譯時Weave

只需要獲得編譯完成之后的模塊,就能進行Weave操作,可以解決模塊化編程的要求.


載入時Weave

如果程序的主邏輯部分和Aspect作為不同的組件開發,程序的主邏輯部分和Aspect部分可以分別進行開發和編譯,而Weave操作在程序別載入時發生.
在JBOSS和Spring中都提供了這樣的方式進行Weave操作,框架先于應用程序啟動,由框架來負責Weave操作的進行,而在AspectJ中,一個特殊的類加載器被用于這個目的。這個類加載器可以方便的嵌入到框架應用程序中,從而能夠為任意的框架提供AOP支持


運行時Weave

所有Weave方式中最為靈活的,程序在運行過程中可以為單個的對象指定是否需要Weave特定的Aspect。AspectJ沒有明確提供運行時Weave的能力,在AspectJ中可以通過一個簡單的pattern實現運行時Weave。具體請參見Adrian的Blog:
http://www.aspectprogrammer.org/blogs/adrian/2005/03/perinstance_asp.html 。




2.2 AspectJ,Spring和JBoss比較

AOP最為特別并使其相對其它方法具有明顯優點的部分就在于它能夠以多樣的方式將程序中用到的多個方面靈活的Weave到一起,形成一個完整的應用程序,下面是AspectJ,Spring和JBoss的比較圖。
 

AspectJ

Spring

JBoss

編譯時

支持



編譯后

支持



載入時

支持

支持

支持

運行時



支持



注:由于high-level層和development-level層對于不同的實現存在很大的區別,所以分別在具體的AOP實現中再進行描述。




參考資源:
Aspect-Oriented Java Development (author: Bob Lee,jAdive和 DynAop框架的創建者)
AOP:選擇正確的時機進行編織 http://www.ibm.com/developerworks/cn/java/j-aop-weave/