Spring-AOP 静态正则表达式方法匹配切面
来源:互联网 发布:b超数据算胎儿体重公式 编辑:程序博客网 时间:2024/06/10 08:09
- 概述
- 实例
- 正则表达式语法
- 正则表达式工具 RegexBuddy
概述
在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是正则表达式方法匹配的切面实现类,该类已经是功能齐全的实现类,一般情况下无需扩展该类。
直接使用RegexpMethodPointcutAdvisor,通过配置的方式为目标类定义一个切面
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 配置切面:静态正则表达式方法匹配切面 --> <!-- Waiter目标类 --> <bean id="waiterTarget" class="com.xgj.aop.spring.advisor.RegexpMethodPointcutAdvisor.Waiter"/> <!-- Seller目标类 --> <bean id="sellerTarget" class="com.xgj.aop.spring.advisor.RegexpMethodPointcutAdvisor.Seller"/> <!-- 前置增强 --> <bean id="greetBeforeAdvice" class="com.xgj.aop.spring.advisor.RegexpMethodPointcutAdvisor.GreetBeforeAdivce"/> <!-- 切面 --> <bean id="regexpAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor" p:advice-ref="greetBeforeAdvice" p:pattern=".*greet.*" > <!-- 向切面注入一个前置增强 , 用正则表达式定义目标类全限定方法名的匹配模式串 。--> </bean> <!-- 通过父bean,配置公共的信息 --> <bean id="parent" abstract="true" class="org.springframework.aop.framework.ProxyFactoryBean" p:interceptorNames="regexpAdvisor" p:proxyTargetClass="true"/> <!-- waiter代理 --> <bean id="waiter" parent="parent" p:target-ref="waiterTarget"/> <!-- seller代理 --> <bean id="seller" parent="parent" p:target-ref="sellerTarget"/></beans>
单元测试
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"); // 从容器中获取Bean Waiter 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简单的测下,如果匹配,下方会以黄色标注。
阅读全文
1 0
- Spring-AOP 静态正则表达式方法匹配切面
- 静态正则表达式方法匹配切面
- 静态正则表达式方法匹配切面
- Spring-AOP 静态普通方法名匹配切面
- spring AOP切面表达式详解
- spring aop匹配表达式
- Spring Aop 表达式匹配
- spring aop 中切面表达式规则
- Spring面向切面编程(AOP-execution表达式)
- 静态普通方法名匹配切面
- 静态普通方法名匹配切面
- 正则表达式 匹配"<"方法!
- Spring AOP-顾问-正则表达式方法切入点顾问
- Spring AOP学习笔记(4):AOP切面优先级&切面表达式重用&xml配置方式
- Spring-AOP:切面优先级和重用切点表达式
- spring aop学习2:切面表达式(Pointcut express)
- 【Spring】AOP - 面向切面
- spring aop 定义切面
- 使用shader实现UI按钮置灰的操作
- Objective-C: ARC和Non-ARC混编的问题
- thinkphp 3.2 钩子原理
- Git与Github的区别
- Sum of a subsequence 多次随机化
- Spring-AOP 静态正则表达式方法匹配切面
- LCA 最近公共祖先——Tarjan(离线)算法的基本思路及其算法实现
- 进制的编码计算问题
- 数组去重
- SSH ajax登录
- C++ const 与 nonconst 的简单关系
- composer安装laravel框架
- python scrapy 的概念、安装、使用和案例
- 斐讯固件收集