AOP (Aspect Oriented Programming) 面向切面編程,通過預編譯或運行期動態代理,在不修改源代碼情況下給程序動態統一添加功能。
本質是 GoF 設計模式中「調用者與被調用者解耦」目標的又一實現。
| 術語 | 定義 | 例子 |
|---|---|---|
| Aspect (切面) | 橫切關注點的模塊化,如日志、事務、安全 | 日志記錄切面 |
| Join Point (連接點) | 程序執行過程中可插入切面的具體位置 | 方法調用、異常拋出、字段修改 |
| Advice (通知) | 切面的具體實現代碼,定義「做什麼」及「何時做」 | 方法前記日志、異常後回滾 |
| Pointcut (切入點) | 定義通知應用到哪些連接點的匹配規則 | execution(* com.service.*.*(..)) |
| Introduction (引介) | 為現有類動態添加新方法/屬性 | 讓任意類實現 Auditable 接口 |
| Target Object (目標對象) | 被通知的對象,可為自定義類或第三方類 | UserServiceImpl |
| Proxy (代理) | 織入通知後生成的對象,外部透明使用 | UserService 的 JDK/CGLIB 代理 |
| Weaving (織入) | 將切面應用到目標對象創建代理的過程 | 編譯期/類加載期/運行期 |

對比 AspectJ 需學習新語法,Spring 門檻極低。
| 條件 | 代理方式 | 原理 |
|---|---|---|
| 目標實現接口 | JDK 動態代理 | java.lang.reflect.Proxy 生成實現同接口的新類 |
| 目標無接口 | CGLIB 代理 | 生成目標類子類,重寫方法織入通知 |
不支持字段攔截。Spring 觀點:字段訪問破壞封裝,對象應通過方法交互。
保證與其他 AOP 框架互操作性。
掌握術語與原理後,下一章將實戰配置 Spring AOP:聲明式事務、日志切面、性能監控等常見場景。