Spring与AOP系列三:顾问(Advisor)

通知(Advice)是Spring提供的一种切面(Aspect)。但其功能过于简单:只能将切面织入到目标类的所有目标方法中,无法完成将切面织入到指定目标方法中。

顾问(Advisor)是Spring提供的另一种切面。其可以完成更为复杂的切面织入功能。PointcutAdvisor是顾问的一种,可以指定具体的切入点。顾问将通知进行了包装,会根据不同的通知类型,在不同的时间点,将切面织入到不同的切入点。

PointcutAdvisor接口有两个较为常用的实现类:

  • NameMatchMethodPointcutAdvisor名称匹配方法切入点顾问
  • RegexpMethodPointcutAdvisor正则表达式匹配方法切入点顾问

1.名称匹配方法切入点顾问

NameMatchMethodPointcutAdvisor,即名称匹配方法切入点顾问。容器可根据配置文件中指定的方法名来设置切入点。

代码不用修改,只在配置文件中注册一个顾问,然后使用通知属性advice与切入点的方法名mappedName对其进行配置。代理中的切面,使用这个顾问即可。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    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">

    <!-- 注册目标对象 -->
    <bean id="someService" class="com.lmm.aop09.SomeServiceImpl"/>
    
    <!-- 注册切面:通知 -->
    <bean id="myAdvice" class="com.lmm.aop09.MyAfterReturningAdvice"/>
    
    <!-- 注册切面:顾问 -->
    <bean id="myAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
    	<property name="advice" ref="myAdvice"/>
    	<!-- 指定切入点:这里匹配的对象是简单方法名 -->
    	<!-- <property name="mappedName" value="doFirst"/> -->
    	<!-- <property name="mappedNames" value="doFirst,doSecond"/> -->
    	<property name="mappedNames" value="*ir*"/>
    </bean>
    
    <!-- 生成代理对象 -->
    <bean id="serviceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
    	<property name="target" ref="someService"/>
    	<property name="interceptorNames" value="myAdvisor"/>
    </bean>

</beans>

2.正则表达式方法切入点顾问

RegexpMethodPointcutAdvisor,即正则表达式方法顾问。容器可根据正则表达式来设置切入点。注意,与正则表达式进行匹配的对象是接口中的方法名,而非目标类(接口的实现类)的方法名。就是方法的全名,比如com.lmm.aop10.SomeServiceImpl.doFirst,而不是匹配doFirst

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    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">

    <!-- 注册目标对象 -->
    <bean id="someService" class="com.lmm.aop10.SomeServiceImpl"/>
    
    <!-- 注册切面:通知 -->
    <bean id="myAdvice" class="com.lmm.aop10.MyAfterReturningAdvice"/>
    
    <!-- 注册切面:顾问 -->
    <bean id="myAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    	<property name="advice" ref="myAdvice"/>
    	<!-- 这里的正则表达式匹配的对象是全限定性方法名 -->
    	<!-- <property name="pattern" value=".*doFirst"/> -->
    	<!-- <property name="patterns" value=".*doFirst,.*doSecond"/> -->
    	<!-- <property name="pattern" value=".*doFirst|.*doSecond"/> -->
    	<!-- 全限定性方法名是的大S匹配了所有的内容,因为每个都有SomeServiceImpl -->
    	<property name="pattern" value=".*S.*"/>
    </bean>
    
    <!-- 生成代理对象 -->
    <bean id="serviceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
    	<property name="target" ref="someService"/>
    	<property name="interceptorNames" value="myAdvisor"/>
    </bean>

</beans>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值