码迷,mamicode.com
首页 > 编程语言 > 详细

spring AOP 概述(二) Pointcut

时间:2018-10-09 22:17:30      阅读:294      评论:0      收藏:0      [点我收藏+]

标签:功能   回调   一个   vat   pre   for   实现原理   nal   bubuko   

  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

标签:功能   回调   一个   vat   pre   for   实现原理   nal   bubuko   

原文地址:https://www.cnblogs.com/toUpdating/p/9763259.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!