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等。
原文地址:https://www.cnblogs.com/toUpdating/p/9763259.html