Aspectj表达式
Aspectj切入點(diǎn)語(yǔ)法定義
在使用spring框架配置AOP的時(shí)候,不管是通過(guò)XML配置文件還是注解的方式都需要定義pointcut"切入點(diǎn)"
例如定義切入點(diǎn)表達(dá)式??execution (* com.sample.service.impl….(…))
execution()是最常用的切點(diǎn)函數(shù),其語(yǔ)法如下所示:
整個(gè)表達(dá)式可以分為五個(gè)部分:
1、execution(): 表達(dá)式主體。
2、第一個(gè)*號(hào):表示返回類型,*號(hào)表示所有的類型。
3、包名:表示需要攔截的包名,后面的兩個(gè)句點(diǎn)表示當(dāng)前包和當(dāng)前包的所有子包,com.sample.service.impl包、子孫包下所有類的方法。
4、第二個(gè)*號(hào):表示類名,*號(hào)表示所有的類。
5、*(…):最后這個(gè)星號(hào)表示方法名,*號(hào)表示所有的方法,后面括弧里面表示方法的參數(shù),兩個(gè)句點(diǎn)表示任何參數(shù)。
AspectJ的Execution表達(dá)式
execution()
execution()是最常用的切點(diǎn)函數(shù),其語(yǔ)法如下所示:
execution(<修飾符模式>??<返回類型模式> <方法名模式>(<參數(shù)模式>)?<異常模式>?)
?除了返回類型模式、方法名模式和參數(shù)模式外,其它項(xiàng)都是可選的。與其直接講解該方法的使用規(guī)則,還不如通過(guò)一個(gè)個(gè)具體的例子進(jìn)行理解。下面,我們給出各種使用execution()函數(shù)實(shí)例。
1)通過(guò)方法簽名定義切點(diǎn)
execution(public * *(…))l
匹配所有目標(biāo)類的public方法,但不匹配SmartSeller和protected void showGoods()方法。第一個(gè)代表返回類型,第二個(gè)代表方法名,而…代表任意入?yún)⒌姆椒?#xff1b;
execution(* *To(…))l
匹配目標(biāo)類所有以To為后綴的方法。它匹配NaiveWaiter和NaughtyWaiter的greetTo()和serveTo()方法。第一個(gè)代表返回類型,而To代表任意以To為后綴的方法;
2)通過(guò)類定義切點(diǎn)
execution(* com.baobaotao.Waiter.*(…))l
匹配Waiter接口的所有方法,它匹配NaiveWaiter和NaughtyWaiter類的greetTo()和serveTo()方法。第一個(gè)*代表返回任意類型,com.baobaotao.Waiter.*代表Waiter接口中的所有方法;
execution(* com.baobaotao.Waiter+.*(…))l
匹 配Waiter接口及其所有實(shí)現(xiàn)類的方法,它不但匹配NaiveWaiter和NaughtyWaiter類的greetTo()和serveTo()這 兩個(gè)Waiter接口定義的方法,同時(shí)還匹配NaiveWaiter#smile()和NaughtyWaiter#joke()這兩個(gè)不在Waiter 接口中定義的方法。
3)通過(guò)類包定義切點(diǎn)
在類名模式串中,“.”表示包下的所有類,而“…”表示包、子孫包下的所有類。
execution(* com.baobaotao.*(…))l
匹配com.baobaotao包下所有類的所有方法;
execution(* com.baobaotao…*(…))l
匹 配com.baobaotao包、子孫包下所有類的所有方法,如com.baobaotao.dao,com.baobaotao.servier以及 com.baobaotao.dao.user包下的所有類的所有方法都匹配?!啊背霈F(xiàn)在類名中時(shí),后面必須跟“*”,表示包、子孫包下的所有類;
execution(* com…*.Dao.find(…))l
匹配包名前綴為com的任何包下類名后綴為Dao的方法,方法名必須以find為前綴。如com.baobaotao.UserDao#findByUserId()、com.baobaotao.dao.ForumDao#findById()的方法都匹配切點(diǎn)。
4)通過(guò)方法入?yún)⒍x切點(diǎn)
切點(diǎn)表達(dá)式中方法入?yún)⒉糠直容^復(fù)雜,可以使用“”和“ …”通配符,其中“”表示任意類型的參數(shù),而“…”表示任意類型參數(shù)且參數(shù)個(gè)數(shù)不限。
execution(* joke(String,int)))l
匹 配joke(String,int)方法,且joke()方法的第一個(gè)入?yún)⑹荢tring,第二個(gè)入?yún)⑹莍nt。它匹配 NaughtyWaiter#joke(String,int)方法。如果方法中的入?yún)㈩愋褪莏ava.lang包下的類,可以直接使用類名,否則必須使用全限定類名,如joke(java.util.List,int);
execution(* joke(String,*)))l
匹 配目標(biāo)類中的joke()方法,該方法第一個(gè)入?yún)镾tring,第二個(gè)入?yún)⒖梢允侨我忸愋?#xff0c;如joke(String s1,String s2)和joke(String s1,double d2)都匹配,但joke(String s1,double d2,String s3)則不匹配;
execution(* joke(String,…)))l
匹配目標(biāo)類中的joke()方法,該方法第 一個(gè)入?yún)镾tring,后面可以有任意個(gè)入?yún)⑶胰雲(yún)㈩愋筒幌?#xff0c;如joke(String s1)、joke(String s1,String s2)和joke(String s1,double d2,String s3)都匹配。
execution(* joke(Object+)))l
匹 配目標(biāo)類中的joke()方法,方法擁有一個(gè)入?yún)?#xff0c;且入?yún)⑹荗bject類型或該類的子類。它匹配joke(String s1)和joke(Client c)。如果我們定義的切點(diǎn)是execution(* joke(Object)),則只匹配joke(Object object)而不匹配joke(String cc)或joke(Client c)。
args()和@args()
args()函數(shù)的入?yún)⑹穷惷?#xff0c;@args()函數(shù)的入?yún)⒈仨毷亲⒔忸惖念惷?。雖然args()允許在類名后使用+通配符后綴,但該通配符在此處沒(méi)有意義:添加和不添加效果都一樣。
1)args()
該函數(shù)接受一個(gè)類名,表示目標(biāo)類方法入?yún)?duì)象按類型匹配于指定類時(shí),切點(diǎn)匹配,如下面的例子:
args(com.baobaotao.Waiter)
表 示運(yùn)行時(shí)入?yún)⑹荳aiter類型的方法,它和execution(* (com.baobaotao.Waiter))區(qū)別在于后者是針對(duì)類方法的簽名而言的,而前者則針對(duì)運(yùn)行時(shí)的入?yún)㈩愋投?。?args(com.baobaotao.Waiter)既匹配于addWaiter(Waiter waiter),也匹配于addNaiveWaiter(NaiveWaiter naiveWaiter),而execution( (com.baobaotao.Waiter))只匹配addWaiter(Waiter
waiter)方法;實(shí)際上,args(com.baobaotao.Waiter)等價(jià)于execution( *(com.baobaotao.Waiter+)),當(dāng)然也等價(jià)于args(com.baobaotao.Waiter+)。
2)@args()
該函數(shù)接受一個(gè)注解類的類名,當(dāng)方法的運(yùn)行時(shí)入?yún)?duì)象標(biāo)注發(fā)指定的注解時(shí),方法匹配切點(diǎn)。這個(gè)切點(diǎn)函數(shù)的匹配規(guī)則不太容易理解,我們通過(guò)以下示意圖對(duì)此進(jìn)行詳細(xì)講解:
轉(zhuǎn)自:https://blog.csdn.net/lang_niu/article/details/51559994
總結(jié)
以上是生活随笔為你收集整理的Aspectj表达式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 格式化移动硬盘或者U盘,并设置为NTFS
- 下一篇: 7天java_7天学完Java基础之0/