標籤:size ota 模式 str .exe 包名 com ring --
切點函數是AspectJ運算式語言的核心, 也是使用@AspectJ進行切面定義的痛點.本小節我們通過具體的執行個體對切點函數進行深入學習.
[email protected]()
@annotation()表示標註了某個註解的所有方法,這個比較簡單.
2.execution()
execution()是最常使用的切點函數,其文法如下:
execution(<修飾符模式>? <傳回型別模式> <方法名模式> (<參數模式>) <異常模式>?)
除了傳回型別模式, 方法名模式, 參數模式是必須的外,其他兩個都不是必須的
(1) 通過方法簽名定義切點
- execution(public * *(..))
匹配所有目標類的public 方法, 第一個*號代表傳回型別, 第二個*號代表方法名.而..代表任意的入參
匹配目標類所有以To結尾的方法, 第一個*代表傳回型別, *To代表所有以To結尾的方法
(2) 通過類定義切點
- execution(* com.bao.bao.Waiter.*(..))
匹配Waiter介面的所有方法, 第一個*號代表返回任意類型, com.bao.bao.Waiter.*代表Waiter介面中的任意方法
- execution(* com.bao.bao.Waiter+.*(..))
匹配Waiter介面及其所有實作類別的方法, 這個和上面的區別在於,這個不但匹配Waiter介面中定義的方法, 還匹配Waiter實作類別中定義的方法(但不在Waiter介面中定義),而上面的那個只匹配Waiter介面中定義的方法
(3) 通過類包定義切點
在類名模式串中, ".*"表示包下的所有類, 而"..*"表示包, 子孫包下的所有類
- execution(* com.bao.bao.*(..))
匹配com. bao.bao包下所有類的所有方法
- execution(* com.bao.bao..*(..))
匹配com.bao.bao包,子孫包下所有類的所有方法. ".."出現在類名中時, 後面必須跟"*"表示包,子孫包下的所有類
- execution(* com..*.*Dao.find*(..))
匹配包名首碼為com的任何包下類名尾碼為Dao的方法, 方法名必須以find為首碼.
(4) 通過方法入參定義切點
切點運算式中, 方法入參部分比較複雜,可以使用"*"和".."萬用字元.其中"*"表示任意類型的參數;而".."表示任意型別參數且參數個數不限.
- execution(* joke(String, *))
匹配目標類中的joke()方法, 該方法第一個入參為String, 第二個入參可以是任意類型
- execution(* joke(String, ..))
匹配目標類中的joke()方法, 該方法第一個入參為String,後面可以有任意多個入參,且類型不限
基於@AspectJ和schema的aop(三)---切點函數詳解