zoukankan      html  css  js  c++  java
  • 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等。

  • 相关阅读:
    1150 Travelling Salesman Problem(25 分)
    poj 2408 Anagram Groups
    guava学习--ratelimiter
    guava学习--Objects
    guava学习--ComparisonChain
    guava学习--Preconditions
    guava学习--Function、Predicate
    guava学习--FutureFallback
    guava学习--FutureCallback
    guava学习--SettableFuture
  • 原文地址:https://www.cnblogs.com/toUpdating/p/9763259.html
Copyright © 2011-2022 走看看