Spring Aop(九)——基于正则表达式的Pointcut
2017-10-15 23:28
399 查看
基于正则表达式的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; }
需要说明的是在上面的匹配逻辑中传递的参数signatureString是对应方法的全路径名称,即包含该方法的类的全路径及该方法的名称,如“org.springframework.aop.support.JdkRegexpMethodPointcut.matches”这种,所以如果我们需要在使用正则表达式定义Pointcut时,也可以匹配某某类的某某方法这种形式。
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。
(本文是基于Spring4.1.0所写,Elim写于2017年5月8日)
相关文章推荐
- Spring AOP-顾问-正则表达式方法切入点顾问
- JavaWeb学习笔记-spring-14-AOP-创建切面(静态正则表达式方法匹配切面)
- 框架 day37 Spring3,AOP,代理模式(动态/CGLIB/工厂bean),传统AOP,AspectJ框架(基于xml/注解),切入点表达式,jdbcTemplate
- Spring-AOP 静态正则表达式方法匹配切面
- spring AOP配置中的正则表达式(转)
- Spring中的AOP(六)——基于XML配置文件方式的AOP
- Spring基于代理的AOP实现
- Spring基于注解的AOP测试
- 学习《spring 3.x企业应用开发实战》之基于@AspectJ和Schema的AOP
- 利用springaop导致基于实现类注入失败的原因及解决方案
- 17、spring AOP通知——Pointcut、Advisor
- aop 正则表达式
- Spring学习记录(十三)---基于xml文件配置AOP
- 基于XML的Spring AOP配置
- 基于正则表达式的数据抓包
- 【Spring AOP】基于Schema配置切面
- 【第六章】 AOP 之 6.4 基于@AspectJ的AOP ——跟我学spring3
- 正则表达式引擎的构建——基于编译原理DFA(龙书第三章)——3 计算4个函数
- Spring学习总结7(AOP-基于XML)
- 基于linux c编程的正则表达式