英文原文出自《Spring In Action》
像絕大多數(shù)的技術(shù)一樣,AOP也有自己的術(shù)語。不幸的是,很多用于描述AOP特征的術(shù)語并不直觀,但是,它們已經(jīng)成為了AOP語言的一部分,如果你想理解AOP,你必須學(xué)會(huì)這門AOP語言。通俗地說,你想在圈子里面混,你就得學(xué)會(huì)說行話。
Aspect
Aspect是你正在實(shí)現(xiàn)的一個(gè)cross-cutting的功能,它是你應(yīng)用中正在模塊化的一個(gè)方面(aspect)。比較通用的一個(gè)例子是日志。記錄日志是一項(xiàng)貫穿整個(gè)應(yīng)用的服務(wù)。由于應(yīng)用基本以功能(基于業(yè)務(wù)邏輯)為界限進(jìn)行劃分模塊,故通過繼承的方法來重用日志模塊似乎不合理。但是,你可以創(chuàng)建一個(gè)日志aspect來實(shí)現(xiàn)你的想法。
Joinpoint
Joinpoint是在應(yīng)用運(yùn)行中那些aspect可以插進(jìn)來的點(diǎn)。這個(gè)點(diǎn)可能是一個(gè)被調(diào)用的方法,一個(gè)被拋出的異常,甚至可以是一個(gè)被改變的字段。在這些點(diǎn)處添加你的aspect的代碼,就可以為你的應(yīng)用增加一些新的行為。
Advice
Advice是對aspect的一個(gè)具體實(shí)現(xiàn)。它向系統(tǒng)建議(advice)增加一個(gè)新的行為。在我們的日志例子中,日志advice包含了記錄日志的代碼并實(shí)現(xiàn)真正的日志記錄,比如將日志寫入文件。Advice被添加到j(luò)oinpoint點(diǎn)上。
Pointcut
Pointcut定義了advice應(yīng)該被插入到什么樣的joinpoint點(diǎn)上。Advice可以被應(yīng)用到任意AOP框架支持的joinpoint上。當(dāng)然,你不會(huì)希望將所有的aspect應(yīng)用到可以被應(yīng)用的joinpoint上面。Pointcut讓你可以指定advice應(yīng)用的位置。通常,你用具體的類名或方法名,或者一些符合表達(dá)式的類或方法名來指定pointcut。 一些AOP框架允許你創(chuàng)建動(dòng)態(tài)的pointcuts,這些pointcuts可以在運(yùn)行的時(shí)候動(dòng)態(tài)決定是否需要應(yīng)用advice,比如方法的參數(shù)值。
Introduction
Introduction可以讓你添加方法和屬性到已經(jīng)存在的類中。例如,你可以創(chuàng)建一個(gè)Auditable的advice類用來跟蹤某對象最后改變的時(shí)期。這個(gè)可以簡單地通過一個(gè)屬性記錄狀態(tài),并添加一個(gè)setLastModified(Date)方法來實(shí)現(xiàn)。然后,它可以被引入(introduce)到已經(jīng)存在的類。這樣,已有的類不需要做任何改變就有了個(gè)新的功能。
Target
Target是正在被advice的類,這可以是你自己寫的一個(gè)類或者是你想增加新的功能的第三方提供的類。沒有AOP,這個(gè)類必須被包括自身主要的邏輯并且額外加上那些cross-cutting關(guān)心的邏輯。有了AOP,target類只需要關(guān)注自身所需要關(guān)心的,而把那些應(yīng)用于自身的advices拋到腦后。
Proxy
Proxy是被應(yīng)用了advice的target實(shí)例。從客戶實(shí)例的角度來看,無論是target實(shí)例(AOP之前)還是proxy實(shí)例(AOP以后),都是一樣的,當(dāng)然,它們本來就應(yīng)該是一樣的。也就是說,你的既有應(yīng)用不需要做改變來支持proxy類。
Weaving
Weaving是指把a(bǔ)spects應(yīng)用到目標(biāo)實(shí)例上去創(chuàng)建一個(gè)新的proxied實(shí)例的過程。Aspects在目標(biāo)對象的joinpoint被組合(weave)進(jìn)去。Weaving可以發(fā)生在目標(biāo)類生存的如下時(shí)間:
- 編譯期 -- Aspects在目標(biāo)類編譯期被weave。這個(gè)需要特殊的編譯器。
- 載入期 -- Aspects在目標(biāo)類載入期被weave。這個(gè)需要特殊的類裝載器。
- 運(yùn)行期 -- Aspects在應(yīng)用運(yùn)行時(shí)的某個(gè)時(shí)期被weave。一般來說,AOP容器在weave in aspects的時(shí)候會(huì)動(dòng)態(tài)創(chuàng)建proxy類來代理target類。
圖例:
PS:
Trackback: http://tb.donews.net/TrackBack.aspx?PostId=697258