下面是 AOP 的一些基本概念 :
aspect (方面):實現了 cross-cutting 功能,是針對方面的模塊,是為題的不同關注點,我們可以將這些方面通過某種方式加入到核心關注點中。
jointpoint (連接點):連接點是方面插入應用程序的地方,該點能被方法調用。
advice (通知): advice 是我們關注點功能的實現,它通知程序新的行為。如在權限處理中, permission advice 包括權限控制的實現代碼。
pointcut (切入點): pointcut 可以指定把哪些 advice 應用到 jointpoint 上去、如何應用上去以及應用的位置。
AOP 包括三個開發步驟:
關注點分解:分解需求提取出橫切關注點和一般關注點。把核心模塊級關注點和系統級的橫切關注點分離開來。就前面所提到的網上購物系統來說,可以分解出四個關注點:核心的訂單處理、權限、日志和事務。
關注點實現:各自獨立的實現這些關注點。
關注點的重新組合:在這一步里,通過創建一個模塊單元來指定關注點重組的規則。重組過程被稱為織入( Weaving )。以前邊的網上購物系統來說,可以通過某種方式指定每個操作結束后需要記錄日志、操作開始前要驗證是否有權限、操作失敗要事務回滾。
下面是 AspectJ 實現日志記錄的一個例子:
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 中沒有的關鍵字,比如 aspect 、 pointcut 等。這些關鍵字都是 AspectJ 提供的,使用這些擴展我們可以用 AspectJ 為 Java 類增加字段及方法,甚至使 Java 支持多繼承。
Spring 沒有自己進行 AOP 技術的實現 , 它的主要實現技術來自于 AOP 聯盟( AOPAlliance )。
Spring AOP 中的術語不像 AspectJ 那樣多,因而也更容易理解和學習。只要理解三個概念就可以, advice , pointcut 和 advisor :
advice 是要向別的模塊內部不同的地方注入的代碼
pointcut 定義了需要注入 advice 的位置,通常是某個特定的類的一個 public 方法
advisor 是 pointcut 和 advice 的裝配器,是將 advice 注入主程序中預定義位置的代碼