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