聲明一個切入點(pointcut)
使用 @Pointcut 註解來表示 ,示例以下:
@Pointcut("execution(* transfer(..))")
private void anyOldTransfer() {}
切入點指定者的支持
Spring AOP 支持在切入點表達式中使用以下的AspectJ切入點指定者:
1 : execution:匹配方法執行的鏈接點,這是你將會用到的Spring的最主要的切入
點指定者。
2 : within:限定匹配特定類型的鏈接點(在使用Spring AOP的時候,在匹配的類型
中定義的方法的執行)。
3 : this:限定匹配特定的鏈接點(使用Spring AOP的時候方法的執行),其中bean
reference(Spring AOP 代理)是指定類型的實例。
4 : target:限定匹配特定的鏈接點(使用Spring AOP的時候方法的執行),其中目
標對象(被代理的appolication object)是指定類型的實例java
5 : args:限定匹配特定的鏈接點(使用Spring AOP的時候方法的執行),其中參數
是指定類型的實例。
6 : @target:限定匹配特定的鏈接點(使用Spring AOP的時候方法的執行),其中
執行的對象的類已經有指定類型的註解。
7 : @args:限定匹配特定的鏈接點(使用Spring AOP的時候方法的執行),其中實
際傳入參數的運行時類型有指定類型的註解。
8 : @within:限定匹配特定的鏈接點,其中鏈接點所在類型已指定註解(在使用
Spring AOP的時候,所執行的方法所在類型已指定註解)。
9 : @annotation:限定匹配特定的鏈接點(使用Spring AOP的時候方法的執行),
其中鏈接點的主題有某種給定的註解spring
合併切入點表達式
切入點表達式可使用‘&&', '||' 和 '!'來合併.還能夠經過名字來指向
切入點表達式app
切入點表達式的基本語法
Spring AOP 用戶可能會常常使用 execution pointcut designator。執行
表達式的格式以下:
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?
name-pattern(param-pattern) throws-pattern?)
除了返回類型模式(上面代碼片段中的ret-type-pattern),名字模式和
參數模式之外,全部的部分都是可選的。 返回類型模式決定了方法的返回類型
必須依次匹配一個鏈接點。
類型匹配模式
1:*:匹配任何數量字符;好比模式 (*,String) 匹配了一個接受兩個參數的方
法,第一個能夠是任意類型,第二個則必須是String類型
2:..:匹配任何數量字符的重複,如在類型模式中匹配任何數量子包;而在方法參
數模式中匹配任何數量參數,可使零到多個。
3:+ + :匹配指定類型的子類型;僅能做爲後綴放在類型模式後邊。this
類型匹配模式示例
1:java.lang.String 匹配String類型;
2:java.*.String 匹配java包下的任何「一級子包」下的String類型;
如匹配java.lang.String,但不匹配java.lang.ss.String
3:java..* 匹配java包及任何子包下的任何類型;
如匹配java.lang.String、java.lang.annotation.Annotation
4:java.lang.*ing 匹配任何java.lang包下的以ing結尾的類型;
5:java.lang.Number+ 匹配java.lang包下的任何Number的子類型;
如匹配java.lang.Integer,也匹配java.math.BigIntegerspa
切入點表達式的基本示例,使用execution
1:public * *(..)
任何公共方法的執行
2:* cn.javass..IPointcutService.*()
cn.javass包及全部子包下IPointcutService接口中的任何無參方法
3:* cn.javass..*.*(..)
cn.javass包及全部子包下任何類的任何方法代理
4:* cn.javass..IPointcutService.*(*)
cn.javass包及全部子包下IPointcutService接口的任何只有一個參數方法
5:* (!cn.javass..IPointcutService+).*(..)
非「cn.javass包及全部子包下IPointcutService接口及子類型」的任何方法
6:* cn.javass..IPointcutService+.*()
cn.javass包及全部子包下IPointcutService接口及子類型的的任何無參方法
7:* cn.javass..IPointcut*.test*(java.util.Date)
cn.javass包及全部子包下IPointcut前綴類型的的以test開頭的只有一個參數類型
爲java.util.Date的方法,注意該匹配是根據方法簽名的參數類型進行匹配的,而不是根
據執行時傳入的參數類型決定的如定義方法:public void test(Object obj);即便執行時
傳入java.util.Date,也不會匹配的。
8:* cn.javass..IPointcut*.test*(..) throws IllegalArgumentException,
ArrayIndexOutOfBoundsException
cn.javass包及全部子包下IPointcut前綴類型的的任何方法,且拋出
IllegalArgumentException和ArrayIndexOutOfBoundsException異常對象
9:* (cn.javass..IPointcutService+ && java.io.Serializable+).*(..)
任何實現了cn.javass包及全部子包下IPointcutService接口和
java.io.Serializable接口的類型的任何方法
10:@java.lang.Deprecated * *(..)
任何持有@java.lang.Deprecated註解的方法
11:@java.lang.Deprecated @cn.javass..Secure * *(..)
任何持有@java.lang.Deprecated和@cn.javass..Secure註解的方法
12:@(java.lang.Deprecated || cn.javass..Secure) * *(..)
任何持有@java.lang.Deprecated或@ cn.javass..Secure註解的方法
13:(@cn.javass..Secure *) *(..)
任何返回值類型持有@cn.javass..Secure的方法
14:* (@cn.javass..Secure *).*(..)
任何定義方法的類型持有@cn.javass..Secure的方法
15:* *(@cn.javass..Secure (*) , @cn.javass..Secure (*))
任何簽名帶有兩個參數的方法,且這個兩個參數都被@ Secure標記了,如public void
test(@Secure String str1, @Secure String str1);接口
16:* *((@ cn.javass..Secure *))或* *(@ cn.javass..Secure *)
任何帶有一個參數的方法,且該參數類型持有@ cn.javass..Secure;如public void
test(Model model);且Model類上持有@Secure註解
17:* *(@cn.javass..Secure (@cn.javass..Secure *) ,@ cn.javass..Secure
(@cn.javass..Secure *))
任何帶有兩個參數的方法,且這兩個參數都被@ cn.javass..Secure標記了;且這兩個參
數的類型上都持有@ cn.javass..Secure;
18:* *(java.util.Map<cn.javass..Model, cn.javass..Model>, ..)
任何帶有一個java.util.Map參數的方法,且該參數類型是以<cn.javass..Model,
cn.javass..Model>爲泛型參數;注意只匹配第一個參數爲java.util.Map,不包括子類型;如
public void test(HashMap<Model, Model> map, String str);將不匹配,必須使用「*
*(java.util.HashMap<cn.javass..Model,cn.javass..Model>, ..)」進行匹配;而public void
test(Map map, int i);也將不匹配,由於泛型參數不匹配
19:* *(java.util.Collection<@cn.javass..Secure *>)
任何帶有一個參數(類型爲java.util.Collection)的方法,且該參數類型是有一個泛型
參數,該泛型參數類型上持有@cn.javass..Secure註解;如public void
test(Collection<Model> collection);Model類型上持有@cn.javass..Secureget
切入點表達式的基本示例,使用within匹配指定類型內的方法
1:within(cn.javass..*)
cn.javass包及子包下的任何方法執行
2:within(cn.javass..IPointcutService+)
cn.javass包或全部子包下IPointcutService類型及子類型的任何方法
3:within(@cn.javass..Secure *)
持有cn.javass..Secure註解的任何類型的任何方法必須是在目標對象上聲
明這個註解,在接口上聲明的對它不起做用it
切入點表達式的基本示例,使用this
使用「this(類型全限定名)」匹配當前AOP代理對象類型的執行方法;注意
是AOP代理對象的類型匹配,這樣就可能包括引入接口方法也能夠匹配;注意
this中使用的表達式必須是類型全限定名,不支持通配符
1:this(cn.javass.spring.chapter6.service.IPointcutService)
當前AOP對象實現了 IPointcutService接口的任何方法
2:this(cn.javass.spring.chapter6.service.IIntroductionService)
當前AOP對象實現了 IIntroductionService接口的任何方法也多是引入接口
切入點表達式的基本示例,使用target
使用「target(類型全限定名)」匹配當前目標對象類型的執行方法;注意是目
標對象的類型匹配,這樣就不包括引入接口也類型匹配;注意target中使用的表達式
必須是類型全限定名,不支持通配符
1:target(cn.javass.spring.chapter6.service.IPointcutService)
當前目標對象(非AOP對象)實現了 IPointcutService接口的任何方法
2:target(cn.javass.spring.chapter6.service.IIntroductionService)
當前目標對象(非AOP對象) 實現了IIntroductionService 接口的任何方法不可能
是引入接口
切入點表達式的基本示例,使用args
使用「args(參數類型列表)」匹配當前執行的方法傳入的參數爲指定類型的執
行方法;注意是匹配傳入的參數類型,不是匹配方法簽名的參數類型;參數類型列表
中的參數必須是類型全限定名,通配符不支持;args屬於動態切入點,這種切入點開
銷很是大,非特殊狀況最好不要使用
1:args (java.io.Serializable,..)
任何一個以接受「傳入參數類型爲 java.io.Serializable」 開頭,且其後可
跟任意個任意類型的參數的方法執行,args指定的參數類型是在運行時動態匹配的
切入點表達式的基本示例,使用@within
使用「@within(註解類型)」匹配因此持有指定註解類型內的方法;註解類型也
必須是全限定類型名
1:@within cn.javass.spring.chapter6.Secure)
任何目標對象對應的類型持有Secure註解的類方法;必須是在目標對象上聲明
這個註解,在接口上聲明的對它不起做用
切入點表達式的基本示例,使用@target
使用「@target(註解類型)」匹配當前目標對象類型的執行方法,其中目標對象
持有指定的註解;註解類型也必須是全限定類型名
1:@target (cn.javass.spring.chapter6.Secure)
任何目標對象持有Secure註解的類方法;必須是在目標對象上聲明這個註解,
在接口上聲明的對它不起做用
切入點表達式的基本示例,使用@args
使用「@args(註解列表)」匹配當前執行的方法傳入的參數持有指定註解的執
行;註解類型也必須是全限定類型名
1:@args (cn.javass.spring.chapter6.Secure)
任何一個只接受一個參數的方法,且方法運行時傳入的參數持有註解
cn.javass.spring.chapter6.Secure;動態切入點,相似於arg指示符;
切入點表達式的基本示例,使用@annotation
使用「@annotation(註解類型)」匹配當前執行方法持有指定註解的方法;註解類型也必
須是全限定類型名
1:@annotation(cn.javass.spring.chapter6.Secure )
當前執行方法上持有註解 cn.javass.spring.chapter6.Secure將被匹配
切入點表達式的基本示例,使用bean 使用「bean(Bean id或名字通配符)」匹配特定名稱的Bean對象的執行方法;Spring AOP 擴展的,在AspectJ中無相應概念 1:bean(*Service) 匹配全部以Service命名(id或name)結尾的Bean