緣起:SoC 與 DRY
- SoC(關注點分離):將系統分解為獨立、單一職責的模組。
- DRY(不要重複自己):提取公共邏輯,避免疊床架屋。
傳統模組化(過程、物件、函數)沿縱向分解,但橫切關注點(Logging、Transaction、Security、Exception Handling 等)橫跨多模組,以碎片形式散落,難以提煉。
AOP 核心術語
| 術語 | 說明 | 中文建議 |
| Aspect | 封裝橫切關注點的模組 | 切面 |
| Join Point | 程式執行中可插入切面的具體點(方法調用、欄位存取、異常拋出等) | 接入點 |
| Pointcut | 符合條件的 Join Point 集合(如 "所有以 set 開頭的方法") | 切入點 |
| Advice | 在 Pointcut 定義的位置執行的代碼邏輯 | 建議 |
| Weaving | 將 Advice 嵌入主程式的過程 | 編織 |
譯名正名:Advice 譯「建議」而非「通知」;Join Point 譯「接入點」而非「連接點」。
AOP 與 OOP 關係
- OOP:沿繼承樹縱向重用。
- AOP:沿橫切關注點橫向重用。
- 結論:AOP 是 OOP 的補充,非分支、非超越;且不限於 OOP(可用於過程式、函數式語言)。
編織機制
- 靜態編織:編譯期、後編譯期、載入期修改原始碼/位元碼(AspectJ、AspectC++)。
- 動態編織:執行期透過 Proxy 動態攔截(Spring AOP、JBoss AOP、AspectWerkz)。
工具支援元編程與產生式編程技術。
光學類比:三稜鏡模型

- 白光 = 複雜系統。
- 第一個三稜鏡 = 關注點分離器 → 分解為單色光(切面)。
- 第二個三稜鏡 = 編織器 → 重組為白光(完整系統)。
實施三步驟:切面分解 → 切面實作 → 切面合成。開發者專注於編寫 Advice 與定義 Pointcut。
閱讀原文文獻的重要性
- 術語翻譯常失真(如 Advice→通知),誤導理解。
- 譯本滯後、質量參差;原文最新、最準確。
- 英語是程式設計師的必修「程式語言」。
適用場景與代價
- 適用:大中型系統、企業級應用(事務、安全、日誌、效能監控)。
- 代價:增加複雜度、微小效能損耗;小型專案屬過度設計。
課後練習
- 在專案中識別 3 個橫切關注點,嘗試用 AspectJ/Spring AOP 重構。
- 對比 Spring AOP(動態代理)與 AspectJ(靜態編織)的優劣與適用邊界。
- 閱讀《AspectJ in Action》原文版深化理解。