基于正则表达式的Pointcut

jdkRegexpMethodPointcut
  Spring官方为我们提供了一个基于正则表达式来匹配方法名的Pointcut,JdkRegexpMethodPointcut。该Pointcut是继承自StaticMethodMatcherPointcut的。我们在定义JdkRegexpMethodPointcut时,可以通过patterns和excludedPatterns来注入需要满足和排除的正则表达式,对应的都是一个String[]。比如我们想匹配所有的方法名以find开头的方法,我们可以如下定义:

  <bean id="regexPointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
        <property name="patterns">
            <list>
                <value>find.*</value><!-- 所有方法名以find开始的方法 -->
            </list>
        </property>
    </bean>

  如果我们需要匹配或需要排除的正则表达式只是单一的一个正则表达式,那么我们也可以通过pattern和excludedPattern来指定单一的需要匹配和排除的正则表达式。需要注意的是patterns和pattern不能同时使用,excludedPattern和excludedPatterns也是一样的。当我们同时指定patterns和excludedPatterns时,该Pointcut将先匹配patterns,对于能够匹配patterns的将再判断其是否在excludedPatterns中,如果存在也将不匹配。以下是该匹配逻辑的核心代码。

  protected boolean matchesPattern(String signatureString) {
        for (int i = 0; i < this.patterns.length; i++) {
            boolean matched = matches(signatureString, i);
            if (matched) {
                for (int j = 0; j < this.excludedPatterns.length; j++) {
                    boolean excluded = matchesExclusion(signatureString, j);
                    if (excluded) {
                        return false;
                    }
                }
                return true;
            }
        }
        return false;
    }

RegexpMethodPointcutAdvisor

  使用了JdkRegexpMethodPointcut后,我们在使用的时候通常会进行如下配置。

    <aop:config>
        <aop:advisor advice-ref="logBeforeAdvice" pointcut-ref="regexPointcut"/>
    </aop:config>
    <bean id="logBeforeAdvice" class="com.elim.learn.spring.aop.advice.LogBeforeAdvice" />
    <bean id="regexPointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
        <property name="patterns">
            <list>
                <value>find.*</value><!-- 所有方法名以find开始的方法 -->
            </list>
        </property>
    </bean>

  其实针对于JdkRegexpMethodPointcut,Spring为我们提供了一个简便的Advisor定义,可以让我们同时指定一个JdkRegexpMethodPointcut和其需要对应的Advice,那就是RegexpMethodPointcutAdvisor,我们可以给它注入一个Advice和对应需要匹配的正则表达式(pattern或patterns注入)。

  <bean class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
        <property name="advice" ref="logBeforeAdvice"/>
        <property name="pattern" value="find.*"/>
    </bean>
需要注意的是RegexpMethodPointcutAdvisor没有提供不匹配的正则表达式注入方法,即没有excludedPattern和excludedPatterns注入,如果需要该功能请还是使用JdkRegexpMethodPointcut。

  

参考:

https://blog.csdn.net/elim168/article/details/78245445

posted on 2018-11-02 16:26  溪水静幽  阅读(1102)  评论(0)    收藏  举报