1、通知 Advice
1)根据对方法进行拦截的时机,分为四种:
Before Advice:方法执行之前进行拦截
AfterReturning Advice:方法正常执行结束之后进行拦截
AfterThrowing Advice:方法异常结束之后进行拦截
Around Advice:环绕通知
2)注意:
AroundAdvice应单独使用,不和其他的三种混合
AroundAdvice中要手动调用目标方法:methodInvocation.proceed()
2、用ProxyFactoryBean来创建代理对象
拦截器Advice
创建Proxy
<bean id=”proxy” class=”org.springframework.ProxyFactoryBean”>
<property name=”target” ref=”targetBean” />
<property nam=”interceptorNames”>
<list>
<value>adviceBean</value>
......
</list>
</property>
</bean>
3、Spring AOP advice方式与AOP方式对比
Spring对基本AOP方式进行了封装,把原来的拦截器改造成能够按时间分来进行拦截的Advice通知方式,平且提供了创建Proxy代理对象的ProxyFactoryBean,只需要给ProxyFactoryBean同时传递target目标对象属性、和interceptorNames的advice集合属性即可。
4、主要实现代码
1)Advice实现
Before Advice
implements MethodBeforeAdvice {
before(Method method, Object[] args, Object target){
//拦截逻辑
log.info(“this is before advice”);
......
}
}
AfterReturning Advice
implements AfterReturningAdvice {
afterReturning(Object result, Method method, Object[] args, Object target) {
//拦截逻辑
log.info(“this is afterReturning advice”);
......
}
}
AfterThrowing Advice
Implements ThrowsAdvice {
afterThrowing(Exception e) {
//拦截逻辑
log.info(“this is afterThrowing advice”);
......
}
}
Around Advice
Implements MethodInterceptor {
invoke(MethodInvocation methodInvocation) {
//拦截逻辑
......
Object result = methodInvocation.proceed();
......
return result;
}
}
可以以spring配置文件或者注解方式声明adviceBean
2)Proxy实现
<bean id=”proxy” class=”org.springframework.ProxyFactoryBean”>
<property name=”target” ref=”targetBean” />
<property nam=”interceptorNames”>
<list>
<value>adviceBean</value>
......
</list>
</property>
</bean>
3)注意:
在spring3中,spring aop advice 依赖于 aopalliance-1.0.jar 包,不引用这个jar包,Acvice类就不能实现相应接口