1. 切入點的標識符
Spring AOP 中目前只有執行方法這一個連接點,其支持的AspectJ
切入點標識符如下:
標識符 | 功能 |
---|---|
execution |
匹配方法執行的連接點 |
within |
匹配指定的類及其子類中的所有方法 |
this |
匹配可以向上轉型爲this指定的類型的代理對象中的所有方法 |
target |
匹配可以向上轉型爲target指定的類型的目標對象中的所有方法 |
args |
匹配運行時傳入的參數列表的類型爲指定的參數列表類型的方法 |
@within |
匹配持有指定註解的類的所有方法 |
@target |
匹配持有指定註解目標對象的所有方法 |
@args |
匹配運行時方法傳入的參數所屬的類持有指定註解的方法 |
@annotation |
匹配持有指定註解的方法 |
2. 常用切入點表達式詳解
符號 | 含義 |
---|---|
* |
匹配任意數量字符 |
.. |
匹配任何數量字符的重複,如在類型模式中匹配任何數量子包;而在方法參數模式中匹配任何數量參數 |
+ |
匹配指定類型的子類型,僅能作爲後綴放在類型模式後邊 |
2.1 execution
execution
的匹配模式是[訪問修飾符] [方法返回值] [包名.類名.方法名] (方法參數),除了返回值、方法名和參數外,另外兩項都是可選的
#匹配任意類任意返回值任意參數數量及類型的 public 方法
@Before(value = "execution(public * *(..))")
#匹配任意以To爲後綴的方法
@Before(value = "execution(* *To(..))")
#匹配Writer接口中及其實現類的方法
@Before(value = "execution(* com.aop.service.Writer+.*(..))")
#匹配 com.aop.service 包下所有類的所有方法
@Before(value = "execution(* com.aop.service.*(..))")
# 匹配所有第一個參數爲 String 類型,第二個參數爲 int 類型的 save 方法
@Before(value = "execution(* save(String,int))")
#匹配除第一個參數固定爲 String 外,後面有任意個入參且入參類型不限的 save 方法
@Before(value = "execution(* save(String,..))")
2.2 target
target
表示當被代理的目標對象可以被轉換爲指定的類型時則匹配成功
#表示匹配實現了 GodService 接口的目標對象的所有方法
@Around(value = "target(aop.service.GodService)")
2.3 @args
匹配方法傳入的參數所屬類上擁有指定的註解的情況
# 匹配方法參數類型上擁有 MyAnnotation 註解的方法調用。例如有一個方法add(MyParam param)
#接收一個MyParam類型的參數,而 MyParam 這個類是擁有註解 MyAnnotation 的,則它可以被匹配上
@Around(value = "@args(com.spring.support.MyAnnotation)")
2.4 @annotation
用於匹配方法上擁有指定註解的情況,最常使用
# 匹配所有擁有 MyAnnotation 註解的外部調用方法
@annotation(com.elim.spring.support.MyAnnotation)