Aspectj execution表達(dá)式

Aspectj切入點語法定義

在使用spring框架配置AOP的時候,不管是通過XML配置文件還是注解的方式都需要定義pointcut"切入點"

例如定義切入點表達(dá)式 execution (* com.sample.service.impl...(..))

execution()是最常用的切點函數(shù),其語法如下所示:

整個表達(dá)式可以分為五個部分:

1、execution(): 表達(dá)式主體。

2、第一個號:表示返回類型,號表示所有的類型。

3、包名:表示需要攔截的包名,后面的兩個句點表示當(dāng)前包和當(dāng)前包的所有子包,com.sample.service.impl包、子孫包下所有類的方法。

4、第二個號:表示類名,號表示所有的類。

5、(..):最后這個星號表示方法名,號表示所有的方法,后面括弧里面表示方法的參數(shù),兩個句點表示任何參數(shù)。

AspectJ的Execution表達(dá)式

execution()

execution()是最常用的切點函數(shù),其語法如下所示:

execution(<修飾符模式>? <返回類型模式> <方法名模式>(<參數(shù)模式>) <異常模式>?)
除了返回類型模式、方法名模式和參數(shù)模式外,其它項都是可選的。與其直接講解該方法的使用規(guī)則,還不如通過一個個具體的例子進(jìn)行理解。下面,我們給出各種使用execution()函數(shù)實例。

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

execution(public * *(..))l

匹配所有目標(biāo)類的public方法,但不匹配SmartSeller和protected void showGoods()方法。第一個代表返回類型,第二個代表方法名,而..代表任意入?yún)⒌姆椒ǎ?/p>

execution(* *To(..))l

匹配目標(biāo)類所有以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接口及其所有實現(xiàn)類的方法,它不但匹配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包下的所有類的所有方法都匹配?!?.”出現(xiàn)在類名中時,后面必須跟“*”,表示包、子孫包下的所有類;

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

匹配包名前綴為com的任何包下類名后綴為Dao的方法,方法名必須以find為前綴。如com.baobaotao.UserDao#findByUserId()、com.baobaotao.dao.ForumDao#findById()的方法都匹配切點。

4)通過方法入?yún)⒍x切點

切點表達(dá)式中方法入?yún)⒉糠直容^復(fù)雜,可以使用“”和“ ..”通配符,其中“”表示任意類型的參數(shù),而“..”表示任意類型參數(shù)且參數(shù)個數(shù)不限。

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

匹 配joke(String,int)方法,且joke()方法的第一個入?yún)⑹荢tring,第二個入?yún)⑹莍nt。它匹配 NaughtyWaiter#joke(String,int)方法。如果方法中的入?yún)㈩愋褪莏ava.lang包下的類,可以直接使用類名,否則必須使用全限定類名,如joke(java.util.List,int);

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

匹 配目標(biāo)類中的joke()方法,該方法第一個入?yún)镾tring,第二個入?yún)⒖梢允侨我忸愋?,如joke(String s1,String s2)和joke(String s1,double d2)都匹配,但joke(String s1,double d2,String s3)則不匹配;

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

匹配目標(biāo)類中的joke()方法,該方法第 一個入?yún)镾tring,后面可以有任意個入?yún)⑶胰雲(yún)㈩愋筒幌?,如joke(String s1)、joke(String s1,String s2)和joke(String s1,double d2,String s3)都匹配。

execution(* joke(Object+)))l

匹 配目標(biāo)類中的joke()方法,方法擁有一個入?yún)?,且入?yún)⑹荗bject類型或該類的子類。它匹配joke(String s1)和joke(Client c)。如果我們定義的切點是execution(* joke(Object)),則只匹配joke(Object object)而不匹配joke(String cc)或joke(Client c)。

args()和@args()

args()函數(shù)的入?yún)⑹穷惷?,@args()函數(shù)的入?yún)⒈仨毷亲⒔忸惖念惷?。雖然args()允許在類名后使用+通配符后綴,但該通配符在此處沒有意義:添加和不添加效果都一樣。

1)args()

該函數(shù)接受一個類名,表示目標(biāo)類方法入?yún)ο蟀搭愋推ヅ溆谥付悤r,切點匹配,如下面的例子:

args(com.baobaotao.Waiter)

表 示運行時入?yún)⑹荳aiter類型的方法,它和execution(* (com.baobaotao.Waiter))區(qū)別在于后者是針對類方法的簽名而言的,而前者則針對運行時的入?yún)㈩愋投?。?args(com.baobaotao.Waiter)既匹配于addWaiter(Waiter waiter),也匹配于addNaiveWaiter(NaiveWaiter naiveWaiter),而execution( (com.baobaotao.Waiter))只匹配addWaiter(Waiter
waiter)方法;實際上,args(com.baobaotao.Waiter)等價于execution(
*(com.baobaotao.Waiter+)),當(dāng)然也等價于args(com.baobaotao.Waiter+)。

2)@args()

該函數(shù)接受一個注解類的類名,當(dāng)方法的運行時入?yún)ο髽?biāo)注發(fā)指定的注解時,方法匹配切點。這個切點函數(shù)的匹配規(guī)則不太容易理解,我們通過以下示意圖對此進(jìn)行詳細(xì)講解:

image.png

轉(zhuǎn)自:https://blog.csdn.net/lang_niu/article/details/51559994

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.Spring對AOP的支持 新增了基于Schema的配置支持,為AOP專門提供了aop命名空間 新增了對Asp...
    小螺釘12138閱讀 917評論 0 2
  • @annotation() @annotation(<注解>) :匹配 標(biāo)注了<注解>的方法 execution(...
    一路搖到頂閱讀 738評論 0 0
  • 不會上色,嗯(⊙_⊙)不過,自我感覺良好,哈哈哈! 描線不可耐了 還是覺得鉛筆的好看些
    五里小徘徊閱讀 300評論 0 2
  • 宏村是我一直列在旅游計劃里的地方,這次終于有機會見到它。 說起中國畫一樣的地方,大多數(shù)人會想到蘇杭一帶?!盁熈嫎?..
    一只銀耳啊閱讀 912評論 0 2
  • 【月下獨酌 李白 】花間一壺酒,獨酌無相親。舉杯邀明月,對影成三人。 月既不解飲,影徒隨我身。暫伴月將影,行樂須及...
    一冉山閱讀 637評論 5 4

友情鏈接更多精彩內(nèi)容