1、切點指示器
類型如下:
1、execution:
*用來匹配連接點方法的,用的最多的一種指示器,可以匹配多個類,必須要寫返回類型,方法名,方法參數,可以寫通配符。
2、within:
用來匹配符合條件的所有類的連接點方法,不可以指定返回類型和方法參數,可以用通配符。expression="within( com.pointcut.impl.*)",匹配com.pointcut.impl包下的所有類的連接點方法。
3、target:
動態代理生成的對象,這種指示器一般表示某個動態代理對象是某個類型,比如this(com.service.EmployeeService),匹配所有EmployeeService的實現類。可以寫接口,抽象類,父類類型,它的子類或實現類都會被匹配。不能寫通配符。target(com.pointcut.impl.BookImpl)
4、this:
和 target,匹配接口或抽象類,父類的實現類和繼承類,不能寫通配符。 不同的是: this(com.pointcut.impl.BookImpl)如果寫實現類的全限定名的話,父類或抽象類未被重寫Override的方法將不會匹配到,而 target能夠匹配到。 因為: 使用“this(類型全限定名)”匹配當前AOP代理對象類型的執行方法。 使用“target(類型全限定名)”匹配當前目標對象類型的執行方法。
5、args:
此指示器匹配對應的方法參數類型,比如args(integer,string),匹配所有帶兩個參數,並且類型是interger,string的連接點方法。
6、@target:
用於匹配當前目標對象類型的執行方法,其中目標對象持有指定的注解;
7、@args:
用於匹配當前執行的方法傳入的參數持有指定注解的執行;
8、@within:
用於匹配所以持有指定注解類型內的方法;
9、@annotation:
用於匹配當前執行方法持有指定注解的方法;
10、bean:
指定bean進行aop代理,bean("emp")
2、指示器邏輯運算符
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throw-pattern?)
*:表示任意名字
..:任意段的任意字符,匹配任何數量字符的重復,如在類型模式中匹配任何數量子包;而在方法參數模式中匹配任何數量參數。
+:匹配指定類型的子類型;僅能作為后綴放在類型模式后邊。
5、常見例子
-
execution(public * *(..)):找到所有的公有方法
-
execution(* *get(..)):
-
public * com.service.emp.EmployeeService+.*(..))
-
表示接口的所有方法以及此接口實現類自己的方法都會被aop代理
-
public * com.service...(..)) 表示com.service包以及子孫包下
-
within( com.service..*) 表示com.service包以及子孫包下的所有類, 寫法與execution指示器是不同的,不需要寫返回類型
-
target( com.service.emp.impl.EmployeeServiceImpl) 給EmployeeServiceImpl 進行aop代理,不能使用通配符.表達式中指定父類型或者接口時是可以的.
-
this(com.service.emp.impl.EmployeeServiceImpl):給EmployeeServiceImpl類 進行aop代理.寫法與target類似. 意思是:如果能代理成功,那么生成的代理類是表達式里面設定的類型的實例
-