ITEEDU

RegExpMethodPointcutAdvisor

Spring 提供的 org.springframework.aop.support.RegexpMethodPointcutAdvisor  可以让您使用 Perl 风格的 Regular expression 来定义 Pointcuts,它是 Spring 中静态 Pointcut 的实例,在符合 Regular expression 的情况下应用 Advices,您可以使用以下的几个符号:

符号

描述

 

 

 

.

符合任何单一字元

 

+

符合前一个字元一次或多次

 

*

符合前一个字元零次或多次

\

Escape 任何 Regular expression 使用到的符号

RegexpMethodPointcutAdvisor的"pattern"属性让您指定所要符合的完整类别名称(包括package名 称)加方法名称,例如若要求符合onlyfun.caterpillar.IHello下的hello开始的方法名称,则要如下撰 写:

 onlyfun\.caterpillar\.IHello\.hello.* 

由于 . 符号已经被Regular expression使用,所以如果表示式中要指定 . 符号,则要跳脱(Escape), 也就是使用 \.  的方式,如果只打算针对方法名称比对,而不管package名称,则可以这么撰写:

 .*hello.*

可以使用 NameMatchMethodPointcutAdvisor 中所使用的类别与Advice,只要改一下Bean定义档 就可以了,例如:

•      beans‐config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN""http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
	<bean id="logBeforeAdvice" class="onlyfun.caterpillar.LogBeforeAdvice"/>
	<bean id="regExpAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
		<property name="pattern">
			<value>.*hello.*</value>
		</property>
		<property name="advice">
			<ref bean="logBeforeAdvice"/>
		</property>
	</bean>
	<bean id="helloSpeaker" class="onlyfun.caterpillar.HelloSpeaker"/>
	<bean id="helloProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
		<property name="proxyInterfaces">
			<value>onlyfun.caterpillar.IHello</value>
		</property>
		<property name="target">
			<ref bean="helloSpeaker"/>
		</property>
		<property name="interceptorNames">
			<list>
				<value>regExpAdvisor</value>
			</list>
		</property>
	</bean>
</beans>
在上面的定义中,设定符合方法名称开头为hello的方法要应用Advice,具无论其前面的package、 类别名称,所以执行结果与 NameMatchMethodPointcutAdvisor  的执行结果是一样的。