此文章摘抄自:<a > [濤哥]</a>
一. execution:用于匹配方法執(zhí)行的連接點;
**within**:用于匹配指定類型內的方法執(zhí)行乳附;
**this**:用于匹配當前AOP代理對象類型的執(zhí)行方法诫咱;注意是AOP代理對象的類型匹配,這樣就可能包括引入接口也類型匹配除破;
**target**:用于匹配當前目標對象類型的執(zhí)行方法;注意是目標對象的類型匹配,這樣就不包括引入接口也類型匹配固灵;
**args**:用于匹配當前執(zhí)行的方法傳入的參數為指定類型的執(zhí)行方法缅帘;
**@within**:用于匹配所以持有指定注解類型內的方法轴术;
**@target:用于匹配當前目標對象類型的執(zhí)行方法,其中目標對象持有指定的注解钦无;
**@args**:用于匹配當前執(zhí)行的方法傳入的參數持有指定注解的執(zhí)行逗栽;
**@annotation**:用于匹配當前執(zhí)行方法持有指定注解的方法;
**bean**:Spring AOP擴展的失暂,AspectJ沒有對于指示符彼宠,用于匹配特定名稱的**Bean**對象的執(zhí)行方法;
**reference pointcut**:表示引用其他命名切入點弟塞,只有@ApectJ風格支持凭峡,Schema風格不支持。
二.類型匹配語法
首先讓我們來了解下AspectJ類型匹配的通配符:
<b>*</b>:匹配任何數量字符宣肚;
.. :(兩個點)匹配任何數量字符的重復想罕,如在類型模式中匹配任何數量子包;而在方法參數模式中匹配任何數量參數霉涨。
** +** :匹配指定類型的子類型按价;僅能作為后綴放在類型模式后邊
表達式 | 說明 |
---|---|
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結尾的類型; |
java.lang.Number+ | 匹配java.lang包下的任何Number的自類型往枷;如匹配java.lang.Integer框产,也匹配java.math.BigInteger |
三.組合切入點表達式
AspectJ使用 且(&&)、或(||)错洁、非(1蕖)來組合切入點表達式。
在Schema風格下屯碴,由于在XML中使用“&&”需要使用轉義字符“&&”來代替之描睦,所以很不方便,因此Spring ASP 提供了and导而、or忱叭、not來代替&&隔崎、||、韵丑!爵卒。
四.切入點使用示例
- execution:使用“execution(方法表達式)”匹配方法執(zhí)行;
表達式 | 說明 |
---|---|
public * *(..) | 任何公共方法的執(zhí)行 |
cn.javass..IPointcutService.*() | cn.javass包及所有子包下IPointcutService接口中的任何無參方法 |
cn.javass...(..) | cn.javass包及所有子包下任何類的任何方法 |
cn.javass...(..) | cn.javass包及所有子包下任何類的任何方法 |
cn.javass..IPointcutService.() | cn.javass包及所有子包下IPointcutService接口的任何只有一個參數方法 |
(!cn.javass..IPointcutService+).*(..) | 非“cn.javass包及所有子包下IPointcutService接口及子類型”的任何方法 |
cn.javass..IPointcutService+.*() | cn.javass包及所有子包下IPointcutService接口及子類型的的任何無參方法 |
cn.javass..IPointcut.test(java.util.Date) | cn.javass包及所有子包下IPointcut前綴類型的的以test開頭的只有一個參數類型為java.util.Date的方法撵彻,注意該匹配是根據方法簽名的參數類型進行匹配的钓株,而不是根據執(zhí)行時傳入的參數類型決定的如定義方法:public void test(Object obj);即使執(zhí)行時傳入java.util.Date,也不會匹配的千康; |
cn.javass..IPointcut.test(..) throwsIllegalArgumentException, ArrayIndexOutOfBoundsException | cn.javass包及所有子包下IPointcut前綴類型的的任何方法享幽,且拋出IllegalArgumentException和ArrayIndexOutOfBoundsException異常 |
(cn.javass..IPointcutService+&& java.io.Serializable+).*(..) | 任何實現了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 (*)) | 任何簽名帶有兩個參數的方法,且這個兩個參數都被@ Secure標記了拾弃,如public void test(@Secure String str1,@Secure String str1); |
- within:使用within(類型表達式)匹配指定類型內的方法執(zhí)行;
表達式 | 說明 |
---|---|
within(cn.javass..*) | cn.javass包及子包下的任何方法執(zhí)行 |
within(cn.javass..IPointcutService+) | cn.javass包或所有子包下IPointcutService類型及子類型的任何方法 |
within(@cn.javass..Secure *) | 持有cn.javass..Secure注解的任何類型的任何方法必須是在目標對象上聲明這個注解摆霉,在接口上聲明的對它不起作用 |
- this:使用this(類型全限定名)匹配當前AOP代理對象類型的執(zhí)行方法豪椿;注意是AOP代理對象的類型匹配,這樣就可能包括引入接口方法也可以匹配携栋;注意this中使用的表達式必須是類型全限定名搭盾,不支持通配符;
表達式 | 說明 |
---|---|
this(cn.javass.spring.chapter6.service.IPointcutService) | 當前AOP對象實現了 IPointcutService接口的任何方法 |
this(cn.javass.spring.chapter6.service.IIntroductionService) | 當前AOP對象實現了 IIntroductionService接口的任何方法也可能是引入接口 |
within(@cn.javass..Secure *) | 持有cn.javass..Secure注解的任何類型的任何方法必須是在目標對象上聲明這個注解婉支,在接口上聲明的對它不起作用 |
- target:使用“target(類型全限定名)”匹配當前目標對象類型的執(zhí)行方法鸯隅;注意是目標對象的類型匹配,這樣就不包括引入接口也類型匹配向挖;注意target中使用的表達式必須是類型全限定名蝌以,不支持通配符;
表達式 | 說明 |
---|---|
target(cn.javass.spring.chapter6.service.IPointcutService) | 當前目標對象(非AOP對象)實現了 IPointcutService接口的任何方法 |
target(cn.javass.spring.chapter6.service.IIntroductionService) | 當前目標對象(非AOP對象) 實現了IIntroductionService 接口的任何方法不可能是引入接口 |
- args:使用args(參數類型列表)”匹配當前執(zhí)行的方法傳入的參數為指定類型的執(zhí)行方法何之;注意是匹配傳入的參數類型跟畅,不是匹配方法簽名的參數類型;參數類型列表中的參數必須是類型全限定名溶推,通配符不支持徊件;args屬于動態(tài)切入點,這種切入點開銷非常大蒜危,非特殊情況最好不要使用虱痕;
表達式 | 說明 |
---|---|
args (java.io.Serializable,..) | 任何一個以接受“傳入參數類型為 java.io.Serializable” 開頭,且其后可跟任意個任意類型的參數的方法執(zhí)行辐赞,args指定的參數類型是在運行時動態(tài)匹配的 |
- @within:使用“@within(注解類型)”匹配所以持有指定注解類型內的方法部翘;注解類型也必須是全限定類型名;
表達式 | 說明 |
---|---|
@within cn.javass.spring.chapter6.Secure) | 任何目標對象對應的類型持有Secure注解的類方法占拍;必須是在目標對象上聲明這個注解略就,在接口上聲明的對它不起作用 |
- @target:使用“@target(注解類型)”匹配當前目標對象類型的執(zhí)行方法捎迫,其中目標對象持有指定的注解;注解類型也必須是全限定類型名表牢;
表達式 | 說明 |
---|---|
@target (cn.javass.spring.chapter6.Secure) | 任何目標對象持有Secure注解的類方法窄绒;必須是在目標對象上聲明這個注解,在接口上聲明的對它不起作用 |
- @args:使用“@args(注解列表)”匹配當前執(zhí)行的方法傳入的參數持有指定注解的執(zhí)行崔兴;注解類型也必須是全限定類型名彰导;
表達式 | 說明 |
---|---|
@args (cn.javass.spring.chapter6.Secure) | 任何一個只接受一個參數的方法,且方法運行時傳入的參數持有注解 cn.javass.spring.chapter6.Secure敲茄;動態(tài)切入點位谋,類似于arg指示符; |
- @annotation:使用@annotation(注解類型)匹配當前執(zhí)行方法持有指定注解的方法堰燎;注解類型也必須是全限定類型名掏父;
表達式 | 說明 |
---|---|
@annotation(cn.javass.spring.chapter6.Secure ) | 當前執(zhí)行方法上持有注解 cn.javass.spring.chapter6.Secure將被匹配 |
- bean:使用“bean(Bean id或名字通配符)”匹配特定名稱的Bean對象的執(zhí)行方法;Spring ASP擴展的秆剪,在AspectJ**中無相應概念赊淑;
表達式 | 說明 |
---|---|
bean(*Service) | 匹配所有以Service命名(id或name)結尾的Bean |