首先我們編寫了通知advice,但是我們還不能表達在應用系統的什麼地方應用這些通知,切入點決定了乙個特定類的特定方法是否滿足特定規則,如果滿足則通知就應用到該方法上,spring的切入點可以讓我們靈活的定義在什麼地方應用通知。
spring的切入點框架的核心介面pointcut
public inte***ce pointcut
pointcut 是根據方法和類決定在什麼地方織入通知的。
classfilter決定了乙個類是否符合通知的要求
public inte***ce classfilter
實現了這個介面的類決定了以引數傳進來的類是否應該被通知,它相當於乙個類的過濾器,一般根據類名過濾,另外這個介面總是包含乙個簡單的classfilter的實現classfilter.true,它是規範任何類的clasfilter例項,它適用於只建立只根據方法來決定是否是應用通知的切入點。
methodmether決定了乙個類的乙個方法是否符合通知的要求
public inte***ce methodmether
advisor
大多數的切面由通知和切入點組成,因此spring把advice和pointcut組合為乙個物件,pointcutadvisor
public inte***ce pointcutadvisor
//大多數的spring自帶的切入點都有乙個對應的pointcutadvisor.
靜態/動態切入點比較
靜態切入點只在**被建立的時候執行一次,而不是在執行期間每次方法呼叫都執行,因此效能比動態切入點好,因此靜態切入點是我們的首選,spring為建立靜態切入點提供了父類staticmethodmatcherpointcut,繼承它並實現ismatch方法就可以了
spring提供的靜態切入點
(1)namematchmethodpointcut
這個類有2個主要方法:
事例:有乙個介面類 myinte***cea ,包含3個方法,set1,set2,get3 ,有乙個實現類myclassaimpl;我們想配置set方法的切入點,如下實現:
//目標物件
//通知
//注入通知
//配置**
//**的介面
myinte***cea
//配置切面
myadvisor
//配置目標物件
//整個過程可以如下幾步:
1 編寫介面:myinte***ce
2 編寫介面的實現myimpl並配置為bean:myimpltarget
3 編寫通知myadvice並配置為bean:myadvice
4 配置切面myadvisor,切面中注入切入點(set*)和通知myadvice
5 配置**myimplproxy,注入介面類myinte***ce,注入切面myadvisor,注入目標對 象myimpltarget
(2)regexpmethodpointcut正規表示式切入點
整個過程同上,但在配置切面時有所不同,見藍色部分**
//定義切面
//方法過濾,注入切入點
[color=blue]
.*get.+by.+
[/color] //注入通知
[color=blue]正規表示式:
.:匹配任何單個字元 例如:setf. 匹配setfi,但不匹配setf 和 setfii
+:匹配前乙個字元一次或者多次,例如setf.+ 匹配setfbar和setfb,不匹配setf
*:匹配前乙個字元0次或者多次,例如setf.* ,同上並匹配setf
\:匹配任何正規表示式符號,例如\.setf ,匹配bar.setf ,不匹配setf[/color]
Spring AOP的切入點execution寫法
任意公共方法的執行 execution public 任何乙個以 set 開始的方法的執行 execution set accountservice 介面的任意方法的執行 execution com.xyz.service.accountservice.定義在service包裡的任意方法的執行 ex...
Spring AOP切入點表示式
為了過濾方法以便將通知應用於spring bean,spring aop提供了各種匹配表示式。這些表示式通常也被稱為切入點指示符 根據型別 比如介面 類名或者包名 過濾方法,spring aop提供了within關鍵字。語法 within 示例 within com.該通知匹配該包及其子包下的所有的...
Spring AOP之切入點指示符
execution是spring aop中最主要的切入點指示符,該切入點的用法相對複雜,execution表示式的格式如下 execution modifiers pattern?ret type pattern declaring type pattern?name pattern param p...