當你初識面向切面程式設計(AOP),或許已嘗試編寫簡單的追蹤切面,或使用 Spring 等框架簡化開發。但接下來該如何深化應用?如何說服團隊採納?本文由切面發明者 Ron Bodkin 提供四階段採用路徑,從初學實驗到建構可重用切面庫,並輔以實用原則與工具整合策略。
經典練習包含異常記錄與效能追蹤。例如記錄模型層呼叫拋出的異常:
public aspect LogModelExceptions {
public pointcut modelCall() : call(public * com.example.myapp.model..* (..));
public pointcut externalModelCall() : modelCall() && !within(com.example.myapp.model..*);
after() throwing (Exception e) : externalModelCall() {
logger.error("Error in calling the model", e);
}
}
效能追蹤切面可記錄超過閾值的 Hibernate 呼叫:
aspect TrackDataAccessPerformance {
public static long threshold = 100L;
public pointcut dataAccessCall() : call(public * org.hibernate..*(..));
Object around() : dataAccessCall() && MyApp.scope() { ... }
}
切面可在測試中強制執行效能門檻、分層架構規則(如禁止資料存取層呼叫模型層),比人工檢查更可靠。
嘗試 Spring、Glassbox Inspector、JBoss Cache、GoF 模式庫等。配置沙盒環境,觀察預建切面如何處理追蹤、安全、事務等需求,並學習擴展抽象切面、使用切點與宣告父類型。
需解決 IDE(重構、建構、除錯)、API 文件、建構/持續整合、執行期環境(載入時織入)、程式碼覆蓋率、UML/靜態分析、EJB 容器等工具的整合。關鍵在於:如何支援切面開發,以及如何支援受切面影響的程式碼開發。
提供建構、測試、執行織入程式碼的標準方式。AJDT (AspectJ Development Tools) 是 Eclipse/RAD 的最佳選擇。載入時織入 (LTW) 不需特殊 IDE 支援,透過 VM 參數即可啟用,適合團隊共享。
使用 ajdoc 產生含切面效果連結的 Javadoc,或 ajbrowser 檢視橫切結構。避免過早使用型別間宣告等進階特性,降低工具支援與團隊理解門檻。
推薦 Eclipse + AJDT,配置 Ant/Maven/CruiseControl 整合 AspectJ 編譯器。程式碼覆蓋工具 (Cobertura/Emma) 支援切面;若使用 Clover 需排除切面代碼並補充相容工具。
跨模組切面易產生循環建構依賴。解決方案:按邏輯依賴順序建構、使用載入時織入、建立連結來源專案進行可視化。最佳策略為使用抽象切面(依賴介面)與具體切面(局部於應用模組),或將切面置於其「自然」所屬模組,採用 .aj 副檔名區隔。
ModelException 並捕獲上下文;進入模型層記錄呼叫者;Web 層統一處理、記錄請求關聯資訊、導向錯誤頁。aop.xml 部署描述符。此階段特徵為切面與類別緊密協作,暴露領域概念。典型應用:
核心技術包括:透過註解或持久化引擎中繼資料暴露業務關係、追蹤連接點序列 (percflow/ThreadLocal)、切面配置與測試 (參考 Adrian Colyer、Nicholas Lesiecki 著作)、切面間協作 (錯誤隔離、JMX 自動註冊)。
發布切點供外部擴展,比傳統 Observer 模式更靈活。計量系統範例展示如何將計費規則 (信用檢查、即時/批次開票、按用戶/付款來源計量、行銷活動) 模組化封裝,隨部署需求組合。
成功採用 AOP 的四階段與四大原則,為開發者與組織提供清晰路標。鼓勵思考對系統有用的切面,漸進理解價值、正確展示、協助他人跟進。詳細應用與原則請參考 AOP@Work 系列其他文章。