切面庫將橫切關注點(日誌、效能監控、事務等)封裝為可復用組件,使用者僅需實例化切入點即可接入業務邏輯。AspectJ 作為 Java 語言擴展,提供抽象切面與註解驅動兩種構建切面庫的原生機制。本文詳解兩種模式的構建、打包與應用流程。
AspectJ 5+ 引入註解支援,AJDT (AspectJ Development Tools) 逐步完善切面庫開發體驗。
sample.aspects.library。AbstractTrace:package sample.aspects.library;
public abstract aspect AbstractTrace {
public abstract pointcut TraceScope(); // 抽象切入點,由子類實現
Object around(): TraceScope() {
Object sig = thisJoinPoint.getSignature();
System.out.println("Enter " + sig);
Object res = proceed();
System.out.println("Exit " + sig);
return res;
}
}
tracelib.jar),包含 .class 與 .aj 編譯產物。tracelib.jar。AbstractTrace,自動生成實現抽象切入點的存根:package aspects;
import sample.aspects.library.AbstractTrace;
public aspect Trace extends AbstractTrace {
public pointcut TraceScope(): execution(* *(..)); // 攔截所有方法執行
}
優點:類型安全、IDE 智能提示、切入點表達式複用性強。缺點:需 AspectJ 編譯器 (ajc),使用者須理解繼承體系。
sample.annotation.library,JDK Compliance 設 5.0+。@trace:package sample.annotation.library;
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD)
public @interface trace {}
AnnotationTrace,切入點匹配帶註解的方法:package sample.annotation.library;
public aspect AnnotationTrace {
pointcut traceScope(): execution(@trace * *(..)); // 匹配帶 @trace 的方法執行
Object around(): traceScope() {
Object sig = thisJoinPoint.getSignature();
System.out.println("Enter " + sig);
Object res = proceed();
System.out.println("Exit " + sig);
return res;
}
}
tracelib.jar(含註解類與切面類)。sample.annotation.application,JDK 5.0+。tracelib.jar(關鍵:Aspect Path 而非 Build Path)。package business.logic;
import sample.annotation.library.trace;
public class MainLogic {
@trace
public static void testTrace() { System.out.println("call testTrace function."); }
public static void main(String[] args) { testTrace(); }
}
Enter void business.logic.MainLogic.testTrace()
call testTrace function.
Exit void business.logic.MainLogic.testTrace()
優點:零繼承、業務代碼無 AspectJ 依賴、切入點聲明極簡潔。缺點:需管理 Aspect Path、註解掃描範圍需配置。
| 維度 | 抽象切面繼承 | 註解驅動 |
|---|---|---|
| 耦合度 | 使用者繼承庫切面,編譯期強依賴 | 僅依賴註解類,切面織入由 Aspect Path 控制 |
| 切入點表達力 | 完整 AspectJ pointcut 語法,支援複雜組合 | 限於註解匹配,複雜邏輯需輔助標記介面 |
| IDE 支援 | AJDT 繼承向導自動生成存根 | 標準 Java 註解編輯,無特殊向導 |
| 部署靈活性 | 需 ajc 編譯全專案 | 可僅編譯業務碼,LTW (Load-Time Weaving) 部署更輕量 |
| 適用場景 | 框架級基礎設施(事務、安全、快取) | 應用級業務切面(審計、效能、除錯標記) |
切面庫是 AOP 復用的關鍵載體。AspectJ 提供兩種正交機制:
實踐中常混合使用:核心基礎設施用抽象切面庫,業務層切面用註解庫。AJDT 工具鏈讓切面庫開發、分發、應用全流程工程化,推動 AOP 從「技術實驗」走向「工程標準」。