spring expression切點表達式


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、指示器邏輯運算符

與and(&&)

或or(||)

非not(!)

 

3、指示器格式

不同的指示器,表達式的寫法模式是不一樣的。

execution

execution(modifiers-pattern?  ret-type-pattern  declaring-type-pattern?  name-pattern(param-pattern) throw-pattern?)

含義如下:

?代表有或者沒有,沒有問號就必須要寫

modifiers-pattern? 修飾者模式 public....

ret-type-pattern 返回類型模式 void,String.....

declaring-type-pattern? 聲明類型模式 static

name-pattern 方法名字模式

param-pattern方法參數模式

throw-pattern?方法拋出異常模式

 

4、通配符

*:表示任意名字

..:任意段的任意字符,匹配任何數量字符的重復,如在類型模式中匹配任何數量子包;而在方法參數模式中匹配任何數量參數。

+:匹配指定類型的子類型;僅能作為后綴放在類型模式后邊。

 

5、常見例子

  1. execution(public * *(..)):找到所有的公有方法

  2. execution(* *get(..)):

  3. public * com.service.emp.EmployeeService+.*(..))

  • 表示接口的所有方法以及此接口實現類自己的方法都會被aop代理

  1. public * com.service...(..)) 表示com.service包以及子孫包下

  2. within( com.service..*) 表示com.service包以及子孫包下的所有類, 寫法與execution指示器是不同的,不需要寫返回類型

  3. target( com.service.emp.impl.EmployeeServiceImpl) 給EmployeeServiceImpl 進行aop代理,不能使用通配符.表達式中指定父類型或者接口時是可以的.

  4. this(com.service.emp.impl.EmployeeServiceImpl):給EmployeeServiceImpl類 進行aop代理.寫法與target類似. 意思是:如果能代理成功,那么生成的代理類是表達式里面設定的類型的實例

  5. bean(emp)表示給emp這個bean進行aop代理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM