spring AOP 概述(二) 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 extendsStaticMethodMatcher 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