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定义档 就可以了,例如:
<?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 的执行结果是一样的。