Spring-AOP|Spring-AOP 静态正则表达式方法如何匹配切面
概述
在Spring-AOP 静态普通方法名匹配切面案例中 StaticMethodMatcherPointcutAdvisor中,仅能通过方法名定义切点,这种描述方式不够灵活,假设目标类中有多个方法,切满足一定的命名规范,使用正则表达式进行匹配就灵活多了。
RegexpMethodPointcutAdvisor是正则表达式方法匹配的切面实现类,该类已经是功能齐全的实现类,一般情况下无需扩展该类。
实例
代码已托管到Github—> https://github.com/yangshangwei/SpringMaster
文章图片
业务类 Waiter和Seller
package com.xgj.aop.spring.advisor.RegexpMethodPointcutAdvisor; public class Waiter { /*** * * @Title: greetTo* * @Description:* * @param name* * @return: void*/ public void greetTo(String name) {System.out.println("Waiter Greet to " + name); } /*** * * @Title: serverTo* * @Description:* * @param name* * @return: void*/ public void serverTo(String name) {System.out.println("Waiter Server to " + name); }}
package com.xgj.aop.spring.advisor.RegexpMethodPointcutAdvisor; public class Seller { /*** * * @Title: greetTo* * @Description: 和Waiter类中的同名的方法,目的是为了验证仅仅织入了Waiter类中的greetTo方法* * @param name* * @return: void*/ public void greetTo(String name) {System.out.println("Seller Greet to " + name); }}
前置增强
package com.xgj.aop.spring.advisor.RegexpMethodPointcutAdvisor; import java.lang.reflect.Method; import org.springframework.aop.MethodBeforeAdvice; /** * * * @ClassName: GreetBeforeAdivce * * @Description: * * @author: Mr.Yang * * @date: 2017年8月18日 下午11:29:46 */public class GreetBeforeAdivce implements MethodBeforeAdvice { @Override public void before(Method method, Object[] args, Object target)throws Throwable {// 输出切点System.out.println("Pointcut:" + target.getClass().getName() + "."+ method.getName()); String clientName = (String) args[0]; System.out.println("How are you " + clientName + " ?"); }}
配置文件
RegexpMethodPointcutAdvisor是正则表达式方法匹配的切面实现类,该类已经是功能齐全的实现类,一般情况下无需扩展该类。
【Spring-AOP|Spring-AOP 静态正则表达式方法如何匹配切面】直接使用RegexpMethodPointcutAdvisor,通过配置的方式为目标类定义一个切面
单元测试
package com.xgj.aop.spring.advisor.RegexpMethodPointcutAdvisor; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * * * @ClassName: RegexpMethodPointcutAdvisorTest * * @Description: 单元测试类 * * @author: Mr.Yang * * @date: 2017年8月18日 下午11:30:01 */public class RegexpMethodPointcutAdvisorTest { @Test public void test() {// 加载配置文件,启动容器ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com/xgj/aop/spring/advisor/RegexpMethodPointcutAdvisor/conf-advisor.xml"); // 从容器中获取BeanWaiter waiter = ctx.getBean("waiter", Waiter.class); Seller seller = ctx.getBean("seller", Seller.class); // 调用业务方法waiter.greetTo("XiaoGongJiang"); waiter.serverTo("XiaoGongJiang"); seller.greetTo("XiaoGongJiang"); }}
运行结果
文章图片
可见,Waiter和 Seller的greetTo()都成功的织入了切面,Waiter.serverTo()没有被织入切面。
RegexpMethodPointcutAdvisor除了pattern和advice属性外 ,还有另外两个属性
patterns: 如果只有一个匹配串模式,这可以使用pattern属性配置,如果需要定义多个匹配模式穿,就需要使用patterns属性了, 这些匹配模式串是“或"的关系。order:切面织入时对应的顺序
正则表达式语法
文章图片
文章图片
文章图片
正则表达式工具 RegexBuddy
文章图片
可以使用RegexBuddy简单的测下,如果匹配,下方会以黄色标注。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- Python爬虫|Python爬虫 --- 1.4 正则表达式(re库)
- iOS,打Framework静态库
- java静态代理模式
- Android|Android JNI之静态注册(android studio)
- C语言静态动态两版本通讯录实战源码
- 正则匹配
- 正则表达式中增加变量
- sed及正则表达式
- Java正则表达式的应用
- 超轻量级静态服务器