spring AOP 概述 Pointcut

Posted 持续在更新的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 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的主要内容,如果未能解决你的问题,请参考以下文章

011-Spring aop 002-核心说明-切点PointCut通知Advice切面Advisor

spring aop中pointcut表达式完整版

Spring-AOP

Spring入门之AOP实践:@Aspect + @Pointcut + @Before / @Around / @After

Spring AOP 切点(pointcut)表达式

spring笔记3-AOP