Spring-AOP 静态正则表达式方法如何匹配切面

 更新时间:2021年07月19日 10:45:43   作者:小小工匠  
这篇文章主要介绍了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是正则表达式方法匹配的切面实现类,该类已经是功能齐全的实现类,一般情况下无需扩展该类。

直接使用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简单的测下,如果匹配,下方会以黄色标注。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 分析Java中Map的遍历性能问题

    分析Java中Map的遍历性能问题

    随着JDK 1.8 Streams API的发布,使得HashMap拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题。本文从几个方面来分析 HashMap各种遍历方式的优势与不足
    2021-06-06
  • Spring Boot 整合 Shiro+Thymeleaf过程解析

    Spring Boot 整合 Shiro+Thymeleaf过程解析

    这篇文章主要介绍了Spring Boot 整合 Shiro+Thymeleaf过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • java中for循环删除集合陷阱

    java中for循环删除集合陷阱

    java中在增强for循环为什么不能增删集合呢?一个循环迭代,跟集合的增删改没什么关系。修改集合不是for去做的。for只管循环迭代,你在循环里边修改集合,改变集合的长度,顺序对循环都有影响
    2015-05-05
  • SpringBoot实现热部署的三种方式

    SpringBoot实现热部署的三种方式

    本文主要介绍了SpringBoot实现热部署的三种方式,主要包括配置pom.xml文件,使用插件的执行命令mvn spring-boot:run启动项,使用springloader本地启动修改jvm参数,使用devtools工具包,感兴趣的可以了解一下
    2023-12-12
  • Java值传递和引用传递详解

    Java值传递和引用传递详解

    这篇文章主要为大家详细介绍了Java值传递和引用传递,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • SpringBoot实现设置动态定时任务的方法详解

    SpringBoot实现设置动态定时任务的方法详解

    这篇文章主要介绍了SpringBoot实现设置动态定时任务的方法详解,SpringBoot是一个快速开发的Java框架,而动态定时任务是指可以在运行时动态添加、修改和删除定时任务的功能,需要的朋友可以参考下
    2023-10-10
  • java用静态工厂代替构造函数使用方法和优缺点

    java用静态工厂代替构造函数使用方法和优缺点

    这篇文章主要介绍了java用静态工厂代替构造函数使用方法和优缺点,需要的朋友可以参考下
    2014-02-02
  • Java中args参数数组的用法说明

    Java中args参数数组的用法说明

    这篇文章主要介绍了Java中args参数数组的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Elasticsearch 基础介绍及索引原理分析

    Elasticsearch 基础介绍及索引原理分析

    这篇文章主要介绍了Elasticsearch 基础介绍及索引原理分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Java IO之File 类详解

    Java IO之File 类详解

    这篇文章主要为大家介绍了vue组件通信的几种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01

最新评论