J2EE 應用必須部署於容器中執行。容器將事務管理、安全控制、物件池/執行緒池等通用功能從業務邏輯中剝離,形成通用框架平台。這正是「關注點分離」的雛形:將橫跨多個模組的共同需求抽離,使業務類別專注核心邏輯。
AOP(Aspect-Oriented Programming,面向切面程式設計)是 OOP 的延續,亦是 GoF 設計模式「解耦呼叫者與被呼叫者」目標的另一種實現。其核心在於將「橫切關注點」封裝為「切面」,實現關注點的模組化。
假設多個存取類別並發存取同一資料物件,需引入鎖機制:
locked()、accessData()、unlocked(),子類別繼承並實作。accessData() 混入鎖邏輯、單一繼承限制復用、鎖邏輯散落於各子類別難以維護。觀察可知,「鎖」具備三大特徵:
AOP 方案:建立「鎖切面」,封裝加鎖/解鎖邏輯,確保所有修改資料操作前後自動織入,業務類別零侵入。
典型應用場景(JBoss 4.0 即採 AOP 實作):
為何需要 AOP? 傳統方式同樣能解決,但 AOP 提供更高抽象層級理解系統,原始碼結構更清晰(JBoss 4.0 比 3.x 易懂)。對純應用開發者,J2EE 容器已實作大部分橫切關注,僅需關注業務切面;若自建容器級服務,AOP 是極佳架構選擇。
| 技術 | 代表專案 | 特點 | 缺點 |
|---|---|---|---|
| AspectJ | Xerox PARC,近十年歷史 | 成熟、功能完整 | 複雜、破壞封裝、需專用編譯器 |
| 動態代理 | JBoss 4.0、Nanning | 基於 JDK Proxy API,標準、輕量 | 僅支援介面代理,無法攔截非介面方法 |
| 位元碼操作 | AspectWerkz、Spring(部分) | 功能強大,支援類別級攔截 | 啟動開銷、工具鏈複雜、除錯困難 |
AOP 並非綁定特定語言,能彌補單一繼承語言(如 Java)的表達力不足。選型需權衡專案複雜度、團隊熟悉度與效能需求。