天天看點

AOP(execution表達式)

轉: http://blog.csdn.net/abcd898989/article/details/50809321

作為AOP的最後一節内容,我們來簡單總結一下切面表達式上見的書寫方法。下面的那内容有參考其他博文,在此先對開源部落格的各位大神表示感謝!

--------------------------------------------------------------------------------------------------------------------------------------------------------

1.我們看看其他博文在此的解釋及舉例

--------------------------------------------------------------------------------------------------------------------------------------------------------

execution(* com.sample.service.impl..*.*(..))

解釋如下:

符号 含義
execution() 表達式的主體;
第一個”*“符号 表示傳回值的類型任意;
com.sample.service.impl AOP所切的服務的包名,即,我們的業務部分
包名後面的”..“ 表示目前包及子包
第二個”*“ 表示類名,*即所有類。此處可以自定義,下文有舉例
.*(..) 表示任何方法名,括号表示參數,兩個點表示任何參數類型

AspectJ中的exection表達式小結:

基本文法格式為:

execution(<修飾符模式>?<傳回類型模式><方法名模式>(<參數模式>)<異常模式>?)  除了傳回類型模式、方法名模式和參數模式外,其它項都是可選的。

下面,我們給出各種使用execution()函數執行個體。

1)通過方法簽名定義切點

 execution(public * *(..))

比對所有目标類的public方法,但不比對SmartSeller和protected voidshowGoods()方法。第一個*代表傳回類型,第二個*代表方法名,而..代表任意入參的方法;

 execution(* *To(..))l

比對目标類所有以To為字尾的方法。它比對NaiveWaiter和NaughtyWaiter的greetTo()和serveTo()方法。第一個*代表傳回類型,而*To代表任意以To為字尾的方法;

2)通過類定義切點

 execution(*com.baobaotao.Waiter.*(..))l

比對Waiter接口的所有方法,它比對NaiveWaiter和NaughtyWaiter類的greetTo()和serveTo()方法。第一個*代表傳回任意類型,com.baobaotao.Waiter.*代表Waiter接口中的所有方法;

 execution(*com.baobaotao.Waiter+.*(..))l

比對Waiter接口及其所有實作類的方法,它不但比對NaiveWaiter和NaughtyWaiter類的greetTo()和serveTo()這兩個Waiter接口定義的方法,同時還比對NaiveWaiter#smile()和NaughtyWaiter#joke()這兩個不在Waiter接口中定義的方法。

3)通過類包定義切點

在類名模式串中,“.*”表示包下的所有類,而“..*”表示包、子孫包下的所有類。

 execution(* com.baobaotao.*(..))l

比對com.baobaotao包下所有類的所有方法;

 execution(* com.baobaotao..*(..))l

比對com.baobaotao包、子孫包下所有類的所有方法,如com.baobaotao.dao,com.baobaotao.servier以及com.baobaotao.dao.user包下的所有類的所有方法都比對。“..”出現在類名中時,後面必須跟“*”,表示包、子孫包下的所有類;

 execution(* com..*.*Dao.find*(..))l

比對包名字首為com的任何包下類名字尾為Dao的方法,方法名必須以find為字首。如com.baobaotao.UserDao#findByUserId()、com.baobaotao.dao.ForumDao#findById()的方法都比對切點。

4)通過方法入參定義切點

切點表達式中方法入參部分比較複雜,可以使用“*”和“..”通配符,其中“*”表示任意類型的參數,而“..”表示任意類型參數且參數個數不限。

 execution(* joke(String,int)))l

匹 配joke(String,int)方法,且joke()方法的第一個入參是String,第二個入參是int。它比對NaughtyWaiter#joke(String,int)方法。如果方法中的入參類型是Java.lang包下的類,可以直接使用類名,否則必須使用全限定類名,如joke(java.util.List,int);

 execution(* joke(String,*)))l

匹 配目标類中的joke()方法,該方法第一個入參為String,第二個入參可以是任意類型,如joke(Strings1,String s2)和joke(String s1,double d2)都比對,但joke(String s1,doubled2,String s3)則不比對;

 execution(* joke(String,..)))l

比對目标類中的joke()方法,該方法第 一個入參為String,後面可以有任意個入參且入參類型不限,如joke(Strings1)、joke(String s1,String s2)和joke(String s1,double d2,Strings3)都比對。

 execution(* joke(Object+)))

匹 配目标類中的joke()方法,方法擁有一個入參,且入參是Object類型或該類的子類。它比對joke(Strings1)和joke(Client c)。如果我們定義的切點是execution(*joke(Object)),則隻比對joke(Object object)而不比對joke(Stringcc)或joke(Client c)。

------------------------------------------------------------------------------------------------------------------------------------

2.現在,我們看看官方文檔對此的解釋及舉例

------------------------------------------------------------------------------------------------------------------------------------

AOP(execution表達式)
AOP(execution表達式)
AOP(execution表達式)
AOP(execution表達式)
AOP(execution表達式)

--------------------------------------------------------------------------------------------------------------------------------

至此,白話spring(基礎篇)---AOP(execution表達式)結束

備注:

上面的表達式我們沒有辦法全部舉例,還請有需求的各位讀者,自行參考官方文檔的解釋,進行相關的配置

參考資料:

Spring官網:http://spring.io/docs

其他博文:

http://outofmemory.cn/code-snippet/3762/Spring-AOP-learn-example

http://tonl.iteye.com/blog/1966075