基于@AspectJ的AOP語法

此文章摘抄自:<a > [濤哥]</a>

一. execution:用于匹配方法執(zhí)行的連接點(diǎn);
  •     **within**:用于匹配指定類型內(nèi)的方法執(zhí)行;
    
  •     **this**:用于匹配當(dāng)前AOP代理對象類型的執(zhí)行方法;注意是AOP代理對象的類型匹配,這樣就可能包括引入接口也類型匹配;
    
  •     **target**:用于匹配當(dāng)前目標(biāo)對象類型的執(zhí)行方法;注意是目標(biāo)對象的類型匹配,這樣就不包括引入接口也類型匹配;
    
  •     **args**:用于匹配當(dāng)前執(zhí)行的方法傳入的參數(shù)為指定類型的執(zhí)行方法;
    
  •     **@within**:用于匹配所以持有指定注解類型內(nèi)的方法;
    
  •     **@target:用于匹配當(dāng)前目標(biāo)對象類型的執(zhí)行方法,其中目標(biāo)對象持有指定的注解;
    
  •     **@args**:用于匹配當(dāng)前執(zhí)行的方法傳入的參數(shù)持有指定注解的執(zhí)行;
    
  •     **@annotation**:用于匹配當(dāng)前執(zhí)行方法持有指定注解的方法;
    
  •     **bean**:Spring AOP擴(kuò)展的,AspectJ沒有對于指示符,用于匹配特定名稱的**Bean**對象的執(zhí)行方法;
    
  •     **reference pointcut**:表示引用其他命名切入點(diǎn),只有@ApectJ風(fēng)格支持,Schema風(fēng)格不支持。
    
二.類型匹配語法

首先讓我們來了解下AspectJ類型匹配的通配符:
<b>*</b>:匹配任何數(shù)量字符;
.. :(兩個(gè)點(diǎn))匹配任何數(shù)量字符的重復(fù),如在類型模式中匹配任何數(shù)量子包;而在方法參數(shù)模式中匹配任何數(shù)量參數(shù)。
** +** :匹配指定類型的子類型;僅能作為后綴放在類型模式后邊

表達(dá)式 說明
java.lang.String 匹配String類型
java.*.String 匹配java包下的任何“一級子包”下的String類型;如匹配java.lang.String,但不匹配java.lang.ss.String
java..* 匹配java包及任何子包下的任何類型;如匹配java.lang.String、java.lang.annotation.Annotation
java.lang.*ing 匹配任何java.lang包下的以ing結(jié)尾的類型;
java.lang.Number+ 匹配java.lang包下的任何Number的自類型;如匹配java.lang.Integer,也匹配java.math.BigInteger
三.組合切入點(diǎn)表達(dá)式

AspectJ使用 且(&&)、或(||)、非(?。﹣斫M合切入點(diǎn)表達(dá)式。
在Schema風(fēng)格下,由于在XML中使用“&&”需要使用轉(zhuǎn)義字符“&&”來代替之,所以很不方便,因此Spring ASP 提供了and、or、not來代替&&、||、!。

四.切入點(diǎn)使用示例
  • execution:使用“execution(方法表達(dá)式)”匹配方法執(zhí)行;
表達(dá)式 說明
public * *(..) 任何公共方法的執(zhí)行
cn.javass..IPointcutService.*() cn.javass包及所有子包下IPointcutService接口中的任何無參方法
cn.javass...(..) cn.javass包及所有子包下任何類的任何方法
cn.javass...(..) cn.javass包及所有子包下任何類的任何方法
cn.javass..IPointcutService.() cn.javass包及所有子包下IPointcutService接口的任何只有一個(gè)參數(shù)方法
(!cn.javass..IPointcutService+).*(..) 非“cn.javass包及所有子包下IPointcutService接口及子類型”的任何方法
cn.javass..IPointcutService+.*() cn.javass包及所有子包下IPointcutService接口及子類型的的任何無參方法
cn.javass..IPointcut.test(java.util.Date) cn.javass包及所有子包下IPointcut前綴類型的的以test開頭的只有一個(gè)參數(shù)類型為java.util.Date的方法,注意該匹配是根據(jù)方法簽名的參數(shù)類型進(jìn)行匹配的,而不是根據(jù)執(zhí)行時(shí)傳入的參數(shù)類型決定的如定義方法:public void test(Object obj);即使執(zhí)行時(shí)傳入java.util.Date,也不會匹配的;
cn.javass..IPointcut.test(..) throwsIllegalArgumentException, ArrayIndexOutOfBoundsException cn.javass包及所有子包下IPointcut前綴類型的的任何方法,且拋出IllegalArgumentException和ArrayIndexOutOfBoundsException異常
(cn.javass..IPointcutService+&& java.io.Serializable+).*(..) 任何實(shí)現(xiàn)了cn.javass包及所有子包下IPointcutService接口和java.io.Serializable接口的類型的任何方法
@java.lang.Deprecated * *(..) 任何持有@java.lang.Deprecated注解的方法
@java.lang.Deprecated @cn.javass..Secure * *(..) 任何持@java.lang.Deprecated和@cn.javass..Secure注解的方法
(@cn.javass..Secure *) *(..) 任何返回值類型持有@cn.javass..Secure的方法
* (@cn.javass..Secure ).(..) 任何定義方法的類型持有@cn.javass..Secure的方法
* (@cn.javass..Secure () , @cn.javass..Secure (*)) 任何簽名帶有兩個(gè)參數(shù)的方法,且這個(gè)兩個(gè)參數(shù)都被@ Secure標(biāo)記了,如public void test(@Secure String str1,@Secure String str1);
  • within:使用within(類型表達(dá)式)匹配指定類型內(nèi)的方法執(zhí)行;
表達(dá)式 說明
within(cn.javass..*) cn.javass包及子包下的任何方法執(zhí)行
within(cn.javass..IPointcutService+) cn.javass包或所有子包下IPointcutService類型及子類型的任何方法
within(@cn.javass..Secure *) 持有cn.javass..Secure注解的任何類型的任何方法必須是在目標(biāo)對象上聲明這個(gè)注解,在接口上聲明的對它不起作用
  • this:使用this(類型全限定名)匹配當(dāng)前AOP代理對象類型的執(zhí)行方法;注意是AOP代理對象的類型匹配,這樣就可能包括引入接口方法也可以匹配;注意this中使用的表達(dá)式必須是類型全限定名,不支持通配符;
表達(dá)式 說明
this(cn.javass.spring.chapter6.service.IPointcutService) 當(dāng)前AOP對象實(shí)現(xiàn)了 IPointcutService接口的任何方法
this(cn.javass.spring.chapter6.service.IIntroductionService) 當(dāng)前AOP對象實(shí)現(xiàn)了 IIntroductionService接口的任何方法也可能是引入接口
within(@cn.javass..Secure *) 持有cn.javass..Secure注解的任何類型的任何方法必須是在目標(biāo)對象上聲明這個(gè)注解,在接口上聲明的對它不起作用
  • target:使用“target(類型全限定名)”匹配當(dāng)前目標(biāo)對象類型的執(zhí)行方法;注意是目標(biāo)對象的類型匹配,這樣就不包括引入接口也類型匹配;注意target中使用的表達(dá)式必須是類型全限定名,不支持通配符;
表達(dá)式 說明
target(cn.javass.spring.chapter6.service.IPointcutService) 當(dāng)前目標(biāo)對象(非AOP對象)實(shí)現(xiàn)了 IPointcutService接口的任何方法
target(cn.javass.spring.chapter6.service.IIntroductionService) 當(dāng)前目標(biāo)對象(非AOP對象) 實(shí)現(xiàn)了IIntroductionService 接口的任何方法不可能是引入接口
  • args:使用args(參數(shù)類型列表)”匹配當(dāng)前執(zhí)行的方法傳入的參數(shù)為指定類型的執(zhí)行方法;注意是匹配傳入的參數(shù)類型,不是匹配方法簽名的參數(shù)類型;參數(shù)類型列表中的參數(shù)必須是類型全限定名,通配符不支持;args屬于動態(tài)切入點(diǎn),這種切入點(diǎn)開銷非常大,非特殊情況最好不要使用;
表達(dá)式 說明
args (java.io.Serializable,..) 任何一個(gè)以接受“傳入?yún)?shù)類型為 java.io.Serializable” 開頭,且其后可跟任意個(gè)任意類型的參數(shù)的方法執(zhí)行,args指定的參數(shù)類型是在運(yùn)行時(shí)動態(tài)匹配的
  • @within:使用“@within(注解類型)”匹配所以持有指定注解類型內(nèi)的方法;注解類型也必須是全限定類型名;
表達(dá)式 說明
@within cn.javass.spring.chapter6.Secure) 任何目標(biāo)對象對應(yīng)的類型持有Secure注解的類方法;必須是在目標(biāo)對象上聲明這個(gè)注解,在接口上聲明的對它不起作用
  • @target:使用“@target(注解類型)”匹配當(dāng)前目標(biāo)對象類型的執(zhí)行方法,其中目標(biāo)對象持有指定的注解;注解類型也必須是全限定類型名;
表達(dá)式 說明
@target (cn.javass.spring.chapter6.Secure) 任何目標(biāo)對象持有Secure注解的類方法;必須是在目標(biāo)對象上聲明這個(gè)注解,在接口上聲明的對它不起作用
  • @args:使用“@args(注解列表)”匹配當(dāng)前執(zhí)行的方法傳入的參數(shù)持有指定注解的執(zhí)行;注解類型也必須是全限定類型名;
表達(dá)式 說明
@args (cn.javass.spring.chapter6.Secure) 任何一個(gè)只接受一個(gè)參數(shù)的方法,且方法運(yùn)行時(shí)傳入的參數(shù)持有注解 cn.javass.spring.chapter6.Secure;動態(tài)切入點(diǎn),類似于arg指示符;
  • @annotation:使用@annotation(注解類型)匹配當(dāng)前執(zhí)行方法持有指定注解的方法;注解類型也必須是全限定類型名;
表達(dá)式 說明
@annotation(cn.javass.spring.chapter6.Secure ) 當(dāng)前執(zhí)行方法上持有注解 cn.javass.spring.chapter6.Secure將被匹配
  • bean:使用“bean(Bean id或名字通配符)匹配特定名稱的Bean對象的執(zhí)行方法;Spring ASP擴(kuò)展的,在AspectJ**中無相應(yīng)概念;
表達(dá)式 說明
bean(*Service) 匹配所有以Service命名(id或name)結(jié)尾的Bean
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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