直接回答
Spring AOP 無法攔截靜態方法。
原理原因
- Spring AOP 基於動態代理(JDK Proxy 或 CGLIB),代理的是對象實例的方法調用。
- 靜態方法屬於類,調用時不需要實例,不走代理鏈,因此無法被攔截。
替代方案
- 改為實例方法 + 單例模式:將類設計為 Spring 管理的單例 Bean,方法去掉
static,即可正常 AOP 攔截。
- AspectJ 靜態織入:使用 AspectJ 編譯時/類加載時織入,可攔截靜態方法,但增加構建複雜度。
- 手動調用切面邏輯:在靜態方法內手動調用切面 Bean 的方法(不推薦,侵入性強)。
最佳實踐
優先選擇「實例方法 + 單例 Bean」,符合 Spring 依賴注入與 AOP 設計初衷,代碼可測試性更強。