下面是
AOP
的一些基本概念
:
aspect
(方面):實現(xiàn)了
cross-cutting
功能,是針對方面的模塊,是為題的不同關(guān)注點,我們可以將這些方面通過某種方式加入到核心關(guān)注點中。
jointpoint
(連接點):連接點是方面插入應(yīng)用程序的地方,該點能被方法調(diào)用。
advice
(通知):
advice
是我們關(guān)注點功能的實現(xiàn),它通知程序新的行為。如在權(quán)限處理中,
permission advice
包括權(quán)限控制的實現(xiàn)代碼。
pointcut
(切入點):
pointcut
可以指定把哪些
advice
應(yīng)用到
jointpoint
上去、如何應(yīng)用上去以及應(yīng)用的位置。
AOP
包括三個開發(fā)步驟:
關(guān)注點分解:分解需求提取出橫切關(guān)注點和一般關(guān)注點。把核心模塊級關(guān)注點和系統(tǒng)級的橫切關(guān)注點分離開來。就前面所提到的網(wǎng)上購物系統(tǒng)來說,可以分解出四個關(guān)注點:核心的訂單處理、權(quán)限、日志和事務(wù)。
關(guān)注點實現(xiàn):各自獨立的實現(xiàn)這些關(guān)注點。
關(guān)注點的重新組合:在這一步里,通過創(chuàng)建一個模塊單元來指定關(guān)注點重組的規(guī)則。重組過程被稱為織入(
Weaving
)。以前邊的網(wǎng)上購物系統(tǒng)來說,可以通過某種方式指定每個操作結(jié)束后需要記錄日志、操作開始前要驗證是否有權(quán)限、操作失敗要事務(wù)回滾。
?
?
下面是
AspectJ
實現(xiàn)日志記錄的一個例子:
public aspect AutoLog
{?
pointcut publicMethods() :
execution(public * org.apache.cactus..*(..));
pointcut logObjectCalls() :
execution(* Logger.*(..));
pointcut loggableCalls() :
publicMethods() && ! logObjectCalls();
before() : loggableCalls()
{
Logger.entry(thisJoinPoint.getSignature().toString());
}
after() : loggableCalls()
{
Logger.exit(thisJoinPoint.getSignature().toString());
}
}
可以看到,這里邊有很多
Java
中沒有的關(guān)鍵字,比如
aspect
、
pointcut
等。這些關(guān)鍵字都是
AspectJ
提供的,使用這些擴展我們可以用
AspectJ
為
Java
類增加字段及方法,甚至使
Java
支持多繼承。
?
?
Spring
沒有自己進(jìn)行
AOP
技術(shù)的實現(xiàn)
,
它的主要實現(xiàn)技術(shù)來自于
AOP
聯(lián)盟(
AOPAlliance
)。
Spring AOP
中的術(shù)語不像
AspectJ
那樣多,因而也更容易理解和學(xué)習(xí)。只要理解三個概念就可以,
advice
,
pointcut
和
advisor
:
advice
是要向別的模塊內(nèi)部不同的地方注入的代碼
pointcut
定義了需要注入
advice
的位置,通常是某個特定的類的一個
public
方法
advisor
是
pointcut
和
advice
的裝配器,是將
advice
注入主程序中預(yù)定義位置的代碼