AspectJ 5 的新語言特性 (註解、泛型) 與部署選項 (載入時織入、aop.xml) 大幅簡化了庫切面的撰寫與使用。然而,編寫健壯、易用的庫切面仍極具挑戰。關鍵在於依據使用者需求與技能量身打造,而非單純追求功能強大。本文透過一個情境故事,展示如何為不同層級使用者 (部署人員、Java 開發者、AOP 專家) 設計切面,同時培訓團隊成員、說服決策主管。
javac 編譯;META-INF/aop.xml 允許在 XML 中宣告具體切點,使用者無需深諳 AspectJ 即可部署。主角擁有約 30 個庫切面,需協助不同角色同事:
withinTypes() 切點,或透過 aop.xml 宣告。AJDT 將錯誤/警告整合於 Eclipse 編輯器標記中。volatile 欄位違規,理解複雜切點 (如 NoCallsIntoTestFromOutside) 的邊界。主管 Zed 指出庫切面假設部署者理解底層切點有風險,建議關鍵靜態檢查改用 JQuery/JDepends。EqualsBoilerplate、NoNullParameters、TrimInputStreamRead 處理空值檢查、輸入流優化。Zed 擔心部署於產品碼,Buddy 認為可暫時接受。ObserveThrown/ObserveThrownContext 記錄異常,支援切點配置與方法覆寫 (observeException、getLogLevel、ignoreException)。Zed 要求加入連接點上下文資訊。ThrownObserver,但發現具體切面無法繼承含通知的超切面,Zed 總結超切面層數宜控制在 1-2 層。CacheToString perthis、CacheMethodResult 單例+Map、CachedItem 精確切點) 展示鍵邏輯與切點/實例化的權衡。需手動失效機制為痛點。IdempotentMethod (pertarget) 與 IdempotentMethods (Map) 結合註解標記,滿足 Zed 對程式碼變更不影響切面的需求。TimedCachedItem 讀取 @TimeToLive 註解自動失效。Connor 提出同一方法不同存取點需不同 TTL,展示註解靈活性。Const 切面透過錯誤宣告保護唯讀欄位/方法/類別;Versioning 實作 IVersioned 介面自動維護版本號。Zed 關切編譯時依賴,Jodi 提議搭配快取/避免鎖測試。TrackedNames/TrackedMethods 搭配 StateTracker (FSM 狀態轉換檔) 即時偵測無效協議步驟。Zed 肯定檔案驅動模式可生成測試案例。SpawnTrueVoids/SpawnLogging 將 void 方法導向工作佇列;ParallelMethodImpl 結合 percflow 實例化、@ParallelMethod 註解、ExecutorService 工廠模式共享配置,實現方法級並行。SubjectObserver<S,O> 泛型切面參數化參與類型,功能委託 AbstractSubjectObserver 便於測試,客戶端透過超類引用註冊觀察者無需知曉切面存在。within/withincode 限制範圍。results() = caching() && permitted() && context()。支援編譯期錯誤宣告檢查未許可連接點,並分離靜態可判定部分供 declare error 使用。註解宣告位置 (目標碼/切面/雙邊) 屬領域語言設計問題,需謹慎平衡表達力與可理解性。
CacheMethodResult<Result> 以型別參數化切點與快取值,結構上保證型別安全,減少不變量檢查。超類實作純 Java 可獨立測試,介面隔離實作細節。
| 切面 | 必要性 | 環境 | 領域 | 規範 | 描述 |
|---|---|---|---|---|---|
| CacheMethodResult | opt | pro | caching | generic pointcut! | 快取方法結果,上下文實現鍵 |
| ParallelMethodImpl | nec | pro | concurrent | annotation convention! {config} | 方法並行調用 |
| SubjectObserver | req | pro | patterns | generic pointcut template | 主體-觀察者協定 |
| TimedCachedItem | opt | pro | caching | generic pointcut annotation | 帶 TTL 註解的快取項目 |
| TrackedMethods | opt | pro | invariants | template pointcut | FSM StateTracker 追蹤方法調用 |
完整列表與源碼請參考 IBM developerWorks。
庫切面編寫雖無魔法,但 AspectJ 5 提供強大工具。成功關鍵在於:理解使用者層次、採用模板切點防禦性編碼、善用註解與泛型、規劃全生命週期、編寫精簡可測試切面。Zed 的決策清單為評估庫切面就緒度提供絕佳框架。願諸位編碼愉快、部署順利!