Aspect-Oriented Architectures
1.AOP基本概念
AOP無(wú)非就是Weave(織入)什么,在哪里Weave,以及什么和哪里之間如何互相作用,這里的什么就引出了Advice(通知)這個(gè)術(shù)語(yǔ),而哪里就引出了pointcut(切入點(diǎn))這個(gè)概念(pointcut是由一組joinpoint連接點(diǎn)組成).而所謂的aspect(方面)就是把a(bǔ)dvice映射到pointcut上.也就是avice和pointcut之間如何相互作用。
Advice(通知)
Adivce(通知)就是指定在連接點(diǎn)(joinpoint)做什么,比如Transactions(事務(wù))、Security(安全)、Performance optimization(性能優(yōu)化)、Error Handling(錯(cuò)誤處理)、Logging,debugging(日志和調(diào)試)等。
Pointcut(切點(diǎn))
切點(diǎn)(pointcut)就是用來(lái)確定應(yīng)該在哪里使用avice(通知),切點(diǎn)(pointcut)由一組連接點(diǎn)(jointpoint)組成(a set of joinpoints)。這些點(diǎn)包括:
* Class names(類(lèi)名)
* Interfaces(接口)
* Method names(方法名)
* Attributes(屬性)
Aspect(方面)
Aspect(方面)就是映射avice(通知)到切入點(diǎn)之上(Maps advice to pointcut),使用下面的方法:
1.Apply this interceptor to these methods (應(yīng)用這些攔截器到方法中)
2.Introduce these methods to these classes(引入這些方法到class中去)
.
由此而引出了兩個(gè)新的概念攔截器(interceptor)和引入(Introduction),而這兩個(gè)概念就是advice(通知)的一種實(shí)現(xiàn),使其在pointcut上產(chǎn)生作用。
Interceptor(攔截器)
攔截器就是在調(diào)用者和被調(diào)用者之間注入一些行為,它們是透明的。一般使用裝飾器/代理模式(Decorator/Proxy pattern)。
攔截的事件包括:
Method invocation(方法調(diào)用)
Object construction(對(duì)象構(gòu)造)
Field access(Field訪問(wèn))
Introduction(引入)
Introduction(引入)是一種mixin(混合)的方式,向class中添加:
* Interfaces(接口)
* Methods(方法)
* Fields(值域)
2.AOP實(shí)現(xiàn)
關(guān)于AOP架構(gòu),AOP聯(lián)盟提出的一個(gè)典型的三層架構(gòu)(可以參考上篇翻譯的文章
Why Did We Get In?),可分為:
l 一個(gè)low-level層:提供基本的組件實(shí)現(xiàn)目標(biāo)平臺(tái)的weaving(AOP主要過(guò)程)
2.一個(gè) high-level層
3.一個(gè)development-level層
而其中Low-level組件是最重要的,因?yàn)檎麄€(gè)的AOE(Aspect Oriented Environnments)依賴于它的實(shí)現(xiàn),組件實(shí)現(xiàn)的方式是至關(guān)緊要的,可能徹底的影響系統(tǒng)屬性,比如性能,可擴(kuò)展性,集成能力,安全等.
所以下面我們關(guān)注一下low-level層的各種Weave方式。
2.1.各個(gè)Weave時(shí)期的優(yōu)缺點(diǎn):
編譯時(shí)Weave
優(yōu)點(diǎn):直觀,支持最多種類(lèi)的連接點(diǎn).
缺點(diǎn):需要提供所有源代碼.(特別對(duì)于模塊化項(xiàng)目,需要所有模塊源代碼),程序不能增量編譯,編譯時(shí)間變慢.
后編譯時(shí)Weave
只需要獲得編譯完成之后的模塊,就能進(jìn)行Weave操作,可以解決模塊化編程的要求.
載入時(shí)Weave
如果程序的主邏輯部分和Aspect作為不同的組件開(kāi)發(fā),程序的主邏輯部分和Aspect部分可以分別進(jìn)行開(kāi)發(fā)和編譯,而Weave操作在程序別載入時(shí)發(fā)生.
在JBOSS和Spring中都提供了這樣的方式進(jìn)行Weave操作,框架先于應(yīng)用程序啟動(dòng),由框架來(lái)負(fù)責(zé)Weave操作的進(jìn)行,而在AspectJ中,一個(gè)特殊的類(lèi)加載器被用于這個(gè)目的。這個(gè)類(lèi)加載器可以方便的嵌入到框架應(yīng)用程序中,從而能夠?yàn)槿我獾目蚣芴峁〢OP支持
運(yùn)行時(shí)Weave
所有Weave方式中最為靈活的,程序在運(yùn)行過(guò)程中可以為單個(gè)的對(duì)象指定是否需要Weave特定的Aspect。AspectJ沒(méi)有明確提供運(yùn)行時(shí)Weave的能力,在AspectJ中可以通過(guò)一個(gè)簡(jiǎn)單的pattern實(shí)現(xiàn)運(yùn)行時(shí)Weave。具體請(qǐng)參見(jiàn)Adrian的Blog:
http://www.aspectprogrammer.org/blogs/adrian/2005/03/perinstance_asp.html 。
2.2 AspectJ,Spring和JBoss比較
AOP最為特別并使其相對(duì)其它方法具有明顯優(yōu)點(diǎn)的部分就在于它能夠以多樣的方式將程序中用到的多個(gè)方面靈活的Weave到一起,形成一個(gè)完整的應(yīng)用程序,下面是AspectJ,Spring和JBoss的比較圖。
|
AspectJ
|
Spring
|
JBoss
|
編譯時(shí)
|
支持
|
|
|
編譯后
|
支持
|
|
|
載入時(shí)
|
支持
|
支持
|
支持
|
運(yùn)行時(shí)
|
|
|
支持
|
注:由于high-level層和development-level層對(duì)于不同的實(shí)現(xiàn)存在很大的區(qū)別,所以分別在具體的AOP實(shí)現(xiàn)中再進(jìn)行描述。
參考資源:
Aspect-Oriented Java Development (author: Bob Lee,jAdive和 DynAop框架的創(chuàng)建者)
AOP:選擇正確的時(shí)機(jī)進(jìn)行編織 http://www.ibm.com/developerworks/cn/java/j-aop-weave/