0
点赞
收藏
分享

微信扫一扫

Spring RegexpMethodPointcutAdvisor和NameMatchMethodPointcutAdvisor




Spring AOP中有两个PointcutAdvisor

——RegexpMethodPointcutAdvisor和 NameMatchMethodPointcutAdvisor,它们都在org.springframework.aop.support包中,

[color=red]都可以过滤要拦截的方法,配置方法也大致相同,其中一个最主要的区别[/color]:
RegexpMethodPointcutAdvisor:[color=red]需要加上完整的类名和方法名[/color],例如:com.xw.methodname或com.*.methodname或.*methodname。[color=red]需要加上完整类名,可以用Spring提供的匹配方式[/color]

NameMatchMethodPointcutAdvisor:[color=red]只需要方法名,不用加类名[/color]:*methodname。


[b]一个配置例子:[/b]

<context:annotation-config />
<context:component-scan base-package="com.shine" />

<bean id="printer" class="com.shine.PrinterImpl"/>
<bean id="afterPrinter" class="com.shine.AfterPrinter"/>

<!-- 配置一个拦截器 (切入点对象,确定何时何地调用拦截器) -->
<bean id="pointcutAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<!-- [通知,特定连接点所采取的动作] -->
<!-- 加入切面,切面为当执行完print方法后 再执行加入的切面 -->
<property name="advice">
<ref local="afterPrinter"/>
</property>
<!-- 要拦截的方法,可根据Spring提供匹配方式进行拦截 -->
<property name="pattern">
<!-- .表示符合任何单一字元
### +表示符合前一个字元一次或多次
### *表示符合前一个字元零次或多次
### \Escape任何Regular expression使用到的符号
-->
<!-- .*表示前面的前缀(包括包名) 表示print方法-->
<value>.*print</value>
</property>
</bean>

<!-- ### 代理工程 -->
<bean id="proxyFactory" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 指定目标对象,目标对象是PrinterImpl对象 -->
<property name="target">
<ref local="printer"/>
</property>

<!-- 该目标中加入拦截器pointcutAdvisor -->
<property name="interceptorNames">
<list>
<value>pointcutAdvisor</value>
</list>
</property>
</bean>


RegexpMethodPointcutAdvisor表示通过正则表达式进行切点描述的切面,它有一个pattern属性用来指定增强要应用到哪些类的哪些方法,[color=red]也可以通过patterns属性指定多个表达式进行匹配[/color]。有一个advice属性用来表示要应用的增强,这样就能表示一个完整的切面了。


我们举几个例子用进一步认识正则表达式在配置匹配方法上的具体应用:


示例1:.*set.*表示所有类中的以set前缀的方法,如com.baobaotao.Waiter.setSalary(),


Person.setName()等;


示例2:com.advisor.*表示com.advisor包下所有类的所有方法;


示例3:com.service.*Service.* 牢匹配com.service包下所有类名以Service结尾的类的所有方法,如com.service.UserService.save(User user)、com.service.ForumService.update(Forum forum)等方法;


示例4:com.service.*.save.+ 匹配com.service包中所有类中所以save为前缀的方法。如匹配com.service.UserService类的saveUser()和saveLoginLog()方法,但不匹配该类中的save()方法。




[color=red][b]1.RegexpMethodPointcutAdvisor [/b][/color]


<!--  将拦截器包装成Advisor-->
<bean id="runAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<!-- advice属性确定处理bean-->
<property name="advice">
<bean class="spring.aop.LoggerAdvice"/>
</property>
<property name="patterns">
<list>
<!--正则表达式-->
<value>.*tst</value>
</list>
</property>
</bean>

<bean id="proxyBean_regexpMethod" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces" value="spring.aop.ITest">
</property>
<property name="interceptorNames">
<list>
<value>runAdvisor</value>
</list>
</property>
<property name="target" ref="testproxyfactorybean"></property>
</bean>




[color=red][b] 2.NameMatchMethodPointcutAdvisor[/b][/color]


<!--  将拦截器包装成Advisor,该对象还确定代理对怎样的方法增加处理-->
<bean id="runAdvisor_Name" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<!-- advice属性确定处理bean-->
<property name="advice">
<!-- 此处的处理bean定义采用嵌套bean,也可引用容器的另一个bean-->
<bean class="spring.aop.LoggerAdvice"/>
</property>
<!-- patterns确定正则表达式模式-->
<property name="mappedNames">
<list>
<!-- 确定正则表达式列表-->
<value>tst</value>
</list>
</property>
</bean>

举报

相关推荐

0 条评论