1. 程式人生 > >spring AOP 概述(二) Pointcut

spring AOP 概述(二) Pointcut

分享圖片 圖片 mat 方法名 end 方法 hat color pointcut

  Pointcut(切點)決定Advice通知應該作用於哪個連接點,也就是說通過Pointcut來定義需要增強的方法

的集合,這些集合的選取可以按照一定的規則來完成。在這種情況下,Pointcut通常意味著標識方法,例如,這些

需要增強的地方可以由某個正則表達式進行標識,或根據某個方法名進行匹配等。

  為了方便用戶使用,Spring AOP提供類具體的切點供用戶使用,切點在Spring AOP中的類繼承體系如下

技術分享圖片

Pointcut定義如下

 1 public interface Pointcut {
 2 
 3     /**
 4      * Return the ClassFilter for this pointcut.
5 * @return the ClassFilter (never {@code null}) 6 */ 7 ClassFilter getClassFilter(); 8 9 /** 10 * Return the MethodMatcher for this pointcut. 11 * @return the MethodMatcher (never {@code null}) 12 */ 13 MethodMatcher getMethodMatcher(); 14 15 16 /** 17 * Canonical Pointcut instance that always matches.
18 */ 19 Pointcut TRUE = TruePointcut.INSTANCE; 20 21 }

  從接口定義中可以看到,需要返回一個MethodMatcher。對於Point的匹配判斷功能,具體是由這個返回

的MethodMatcher來完成的,以正則表達式切點JdkRegexpMethodPointcut的實現原理為例,來具體了解

切點Pointcut的工作原理,繼承關系如下

技術分享圖片

在JdkRegexpMethodPoint的基類StaticMethodMatcherPointcut的實現中

 1 public abstract class StaticMethodMatcherPointcut extends
StaticMethodMatcher implements Pointcut { 2 3 private ClassFilter classFilter = ClassFilter.TRUE; 4 5 6 /** 7 * Set the {@link ClassFilter} to use for this pointcut. 8 * Default is {@link ClassFilter#TRUE}. 9 */ 10 public void setClassFilter(ClassFilter classFilter) { 11 this.classFilter = classFilter; 12 } 13 14 public ClassFilter getClassFilter() { 15 return this.classFilter; 16 } 17 18 19 public final MethodMatcher getMethodMatcher() { 20 return this; 21 } 22 23 }

可以看到,設置MethodMatcher為StaticMethodMatcher,同時JdkRegexpMethodPointcut也是這個MethodMatcher的子類

  看出來,在Pointcut中,通過這樣的類繼承關系,MethodMatcher對象實際上是可以被配置成JdkRegexpMethodPointcut來完成方法的匹配判斷的。在JdkRegexpMethod

-Point中,可以看到一個matches方法,這個matches方法是MethodMatcher定義的接口方法。在JdkRegexpMethodPointcut的實現中,這個matches方法就是使用正則

表達式來對方法名進行匹配的地方。關於在AOP框架中對matches方法的調用,調用關系如下

技術分享圖片

  在對matches方法的調用關系中可以看到,是在JdkDynamicAopProxy的invoke方法中觸發了對matches方法的調用。這個invoke方法就是Proxy對象進行代理回調的入口

方法,這個invoke回調的實現是使用JDK動態代理完成的

  在Spring AOP中,還提供類其他的MethodPointcut,比如通過方法名匹配進行Advice匹配的NameMatchMethodPointcut等。

spring AOP 概述(二) Pointcut