OOP 擅長縱向建模(繼承體系),但無力處理橫向關注點:日誌、事務、安全、異常處理等代碼分散在各業務模塊,導致重復、耦合、難復用。AOP(面向切面編程)應運而生。
對象 = 空心圓柱體(封裝屬性行為);AOP = 利刃剖開圓柱體,提取橫切邏輯封裝為「切面」,再無痕復原。實現核心關注點與橫切關注點分離。
| 術語 | 定義 | 類比 |
|---|---|---|
| Join Point (連接點) | 程序執行的精確點(方法調用、異常拋出、字段訪問) | 「可能被切入的位置」 |
| Pointcut (切入點) | 匹配連接點的謂詞表達式 | 「選擇哪些位置」 |
| Advice (通知/增強) | 切入點匹配時執行的邏輯 | 「做什麼」 |
| Aspect (切面) | Pointcut + Advice 的模塊化單元 | 「完整的橫切功能單元」 |
| Introduction (引入/混入) | 為現有類動態添加方法/字段/接口實現 | 「擴展類結構」 |
Before:目標方法前After Returning:正常返回後After Throwing:拋出異常後After (Finally):無論如何執行Around:環繞目標方法,可控制是否執行、修改參數/返回值(最強大)| 框架 | 織入方式 | 特點 | 典型場景 |
|---|---|---|---|
| Spring AOP | 運行時代理 | 易用、Spring 生態無縫集成、@AspectJ 註解 | 企業級應用事務、日誌、權限 |
| AspectJ | 編譯時/LTW | 功能完整、性能最優、語法豐富 | 基礎設施、框架開發、性能敏感場景 |
| JBoss AOP | 類加載時 | JBoss 整合、支持字段攔截 | JBoss 環境 |
execution(* com.service..*(..))),避免過度匹配@Order)