顾问(Advisor)是 Spring 提供的另一种切面。其可以完成更为复杂的切面织入功能。
PointcutAdvisor 是顾问的一种,可以指定具体的切入点。顾问将通知进行了包装,会根据不
同的通知类型,在不同的时间点,将切面织入到不同的切入点。
PointcutAdvisor 接口有两个较为常用的实现类:
NameMatchMethodPointcutAdvisor 名称匹配方法切入点顾问 匹配对象是简单方法名
PointcutAdvisor 是顾问的一种,可以指定具体的切入点。顾问将通知进行了包装,会根据不
同的通知类型,在不同的时间点,将切面织入到不同的切入点。
PointcutAdvisor 接口有两个较为常用的实现类:
NameMatchMethodPointcutAdvisor 名称匹配方法切入点顾问 匹配对象是简单方法名
RegexpMethodPointcutAdvisor 正则表达式匹配方法切入点顾问 匹配对象是全限定性方法名
名称匹配方法切入点顾问
<?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.gqc.aop09.SomeServiceImpl"/>
<!-- 注册切面:后置通知 -->
<bean id="myAdvice" class="com.gqc.aop09.MyAfterReturningAdvice"/>
<!-- 注册切面:顾问 -->
<bean id="myAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="myAdvice"/>
<!-- 指定切入点:这里匹配的对象是简单方法名 -->
<property name="mappedNames" value="*ir*"/> <!-- 也可以value="first,second" -->
</bean>
<!-- 生成代理对象 -->
<bean id="serviceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 指定目标对象 -->
<property name="target" ref="someService"/>
<!-- <property name="targetName" value="someService"/> -->
<!-- 指定切面 -->
<property name="interceptorNames" value="myAdvisor"/>
</bean>
</beans>
正则表达式匹配方法切入点顾问
<?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.gqc.aop10.SomeServiceImpl"/>
<!-- 注册切面:后置通知 -->
<bean id="myAdvice" class="com.gqc.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"/>
</bean>
<!-- 生成代理对象 -->
<bean id="serviceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 指定目标对象 -->
<property name="target" ref="someService"/>
<!-- <property name="targetName" value="someService"/> -->
<!-- 指定切面 -->
<property name="interceptorNames" value="myAdvisor"/>
</bean>
</beans>