execution 表達式語法全景
Spring AOP 中最常用的 execution 切點指示符,完整語法結構:
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
各部分詳細說明
| 部分 | 是否必需 | 說明 | 常用模式 |
| modifiers-pattern | 可選 | 訪問修飾符 | public、protected、* |
| ret-type-pattern | 必需 | 返回類型模式 | *(任意)、void、全限定類名 |
| declaring-type-pattern | 可選 | 聲明類型(類/接口全限定名) | com.service.*、com..Service |
| name-pattern | 必需 | 方法名模式 | *、get*、save* |
| param-pattern | 必需 | 參數列表模式 | ()、(..)、(*,String) |
| throws-pattern | 可選 | 拋出異常模式 | throws Exception |
參數模式(param-pattern)深度解析
():無參方法
(..):任意數量、任意類型參數(最常用,含 0 參)
(*):恰好一個參數,類型任意
(*, String):兩個參數,第一個任意,第二個必須為 String
(java.io.Serializable, ..):第一個參數為 Serializable,其餘任意
經典實戰模式速查表
| 匹配目標 | execution 表達式 | 說明 |
| 任意公共方法 | execution(public * *(..)) | 第一個 * 為返回類型,第二個 * 為方法名 |
| 所有以 "set" 開頭的方法 | execution(* set*(..)) | 返回類型任意 |
| AccountService 接口所有方法 | execution(* com.xyz.service.AccountService.*(..)) | 類全限定名 + .* 匹配所有方法 |
| service 包下所有類的所有方法 | execution(* com.xyz.service.*.*(..)) | 包路徑通配:*.* = 類.方法 |
| service 包及子包所有類所有方法 | execution(* com.xyz.service..*.*(..)) | .. 遞歸匹配子包 |
| 特定參數類型的方法 | execution(* *.save(java.lang.String, ..)) | 第一個參數為 String |
| 帶註解的方法 | execution(@Transactional * *(..)) | 配合 @Annotation 使用 |
進階技巧與避坑指南
1. 類路徑通配符區別
com.service.*:僅匹配 com.service 包下的類
com.service..*:匹配 com.service 及所有子包下的類
com..Service:匹配 com 及子包下類名以 Service 結尾的類
2. 返回類型模式選擇
*:通配所有返回類型(推薦,覆蓋面廣)
- 具體類型:
java.util.List、void——針對性增強,但維護成本高
3. 組合切點表達式
<aop:pointcut id="serviceMethods" expression="execution(* com.example.service..*.*(..))"/>
<aop:pointcut id="daoMethods" expression="execution(* com.example.dao..*.*(..))"/>
<aop:pointcut id="allBusiness" expression="serviceMethods or daoMethods"/>
4. 常見錯誤
- 遺漏返回類型:
execution(* *(..)) 正確,execution(*(..)) 報錯
- 包路徑錯誤:類全限定名必須準確,
.. 僅能用於包路徑,不可用於類名中間
- 參數模式括號:
(..) 兩邊括號不可省略
最佳實踐建議
- 業務層切點統一管理:在配置文件集中定義
id="serviceLayer" 等通用切點
- 優先使用接口切點:
execution(* com.service.MyService+.*(..))(+ 表示接口及實現類)
- 避免過度通配:
execution(* *(..)) 會匹配所有 Bean 方法,影響啟動性能與調試
- 文檔化切點語義:
<aop:pointcut id="txMethods" expression="..."/> 配合註解說明業務含義