通知(advice)是Spring中的一种比较简单的切面,只能将切面织入到目标类的所有方法中,而无法对指定方法进行增强
顾问(advisor)是Spring提供的另外一种切面,可以织入到指定的方法中 接口 PointcutAdvisor
实现类:
NameMatchMethodPointcutAdvisor(名称匹配方法切入点顾问),
RegexpMethodPointcutAdvice(正则匹配切入点顾问)
一、名称匹配方法切入点顾问
1.接口及其实现类
public void doSome();
public void doSome() {
System.out.println("123");
}
2.增强类
public class BeaforeAdvisor implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println("前置==========");
}
}
3.大配置文件
<!--目标对象注入-->
<bean id="proServiceimpl" class="cn.spring.advisor.ProServiceImpl"></bean> <!--增强类注入--> <bean id="beaforeAdvisor" class="cn.spring.advisor.BeaforeAdvisor"></bean> <!--顾问--> <bean id="advisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor" > <property name="advice" ref="beaforeAdvisor"></property> <property name="mappedNames" value="doSome"></property> </bean> <!--使用代理工厂--> <bean id="ProFactory" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="proServiceimpl"></property> <property name="interceptorNames" value="advisor"></property> </bean>
二、正则匹配的切入点顾问
<!--目标对象注入-->
<bean id="proServiceimpl" class="cn.spring.advisor.ProServiceImpl"></bean>
<!--增强类注入-->
<bean id="beaforeAdvisor" class="cn.spring.advisor.BeaforeAdvisor"></bean>
<!--顾问-->
<bean id="advisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor" >
<property name="advice" ref="beaforeAdvisor"></property>
<property name="pattern" value=".*do.*"></property>
</bean>
<!--使用代理工厂-->
<bean id="ProFactory" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="proServiceimpl"></property>
<property name="interceptorNames" value="advisor"></property>
</bean>
三、顾问的自动代理
顾问代理生成器,当我们声明好顾问后为目标对象生成代理对象。如果项目中 存在多个代理对象的话,需要实例化许多的ProxyFactoryBean,我们可以使用顾问代理生成器来解决这个问题。
顾问代理生成器主要分两种
- 默认顾问代理生成器:DefaultAdvisorAutoProxyCreator
- 名称顾问代理生成器:BeanNameAutoProxyCreator
1.默认顾问自动代理生成器
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean>
2.名称顾问代理生成器
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<!--指定目标对象进行织入 多个对象用,分割--> <property name="beanNames" value="proServiceimpl,beanTest"></property>
<!--指定顾问-->
<property name="interceptorNames" value="advisor"></property> </bean>