Advice标签接口是所有处理的根接口.spring还包含如下内建的处理类:
MethodInterceptor
ThrowsAdvice
BeforeAdvice
AfterReturningAdvice
spring主要提供静态和动态切入点:判断静态切入点只考虑类和方法。Spring只需第一次调用方法时判断表态切入点,不需要在每次调用方法
时判断。判断动态切入点则不仅需要类和方法,还需要调用方法的参数,因此,每一次调用方法都必须判断。常用的切入点是与正则表达式切入点。
1、Around处理
实现around处理需要实现MethodInterceptor接口(由AOP聪明提供),源代码如下:
[code]public interface MethodInterceptor extends Interceptor
{
Object invoke(MethodInvocation invocation) throws Throwable;
}[/code]
通过MethodInvocation可以执行目标方法,invoke返回调用的结果,即连接点的返回值。
2、Before处理
必须实现MethodBeforeAdvice接口,该接口的源代码如下:
[code]public interface MethodBeforeAdvice extends BeforeAdvice {
//参数分别是:执行的方法,调用方法的参数量和目标对象
void before(Method method, Object[] args, Object target) throws Throwable;
}[/code]
Before处理可以被用于任何类型的切入点。
3、After Returning处理
必须实现AfterReturnAdvice接口,源代码如下:
[code]public interface AfterReturningAdvice extends Advice {
/**
* @param returnValue 目标方法的返回值
* @param method 目标方法对象
* @param args 方法的参数
* @param target目标对象
*/
void afterReturning(Object returnValue, Method method, Object[] args, Object target)
throws Throwable;
}[/code]
4、throws处理:须实现ThrowsAdvice接口。
Introduction处理:须实现MethodIntercepto接口;不能作用于任何切入点,只作用于类层次,而不是方法层次。
5、拦截器的定义顺序很重要。拦截器前面的处理先被调用,链后面的处理后被调用。
6、ProxyFactoryBean的bean工厂:
如果目标类没有实现接口,需要对类生成代理,而不能为接口生代理。为类生成代理,需要使用CGLIB,而不能使用JDK动态代理。可以这么做:
[1]去掉<property name="proxyInterfaces">声明
[2]增加<preperty name="proxyTargetClass">子元素,并设其值为true。
另外,说明一下,在实现接口的情况也可强制使用CGLIB代理。
还有一点注意的是:
CGLIB代理是目标对象子类,必须考虑:
[1]目标类不能声明为final,因为final类不能被继承,无法生成代理
[2]目标方法也不能声明为final,final方法不能被重写,无法得到处理。
7、TransactionProxyFactoryBean其中的两个属性:preInterceptors,postInterceptors分别用来确定事务拦截器前后的拦截器链。
8、个人观点:提倡用BeanNameAutoProxyCreator,在管理事务的时候;不提倡用DefaultAdvisorAutoProxyCreator。
9、Advisor等于切入点加处理,是aspect的模块化的表示。除了Intorduction处理,Advisor可以被用于任何处理。DefaultPointcutAdvisor是最通用的Advisor类。
MethodInterceptor
ThrowsAdvice
BeforeAdvice
AfterReturningAdvice
spring主要提供静态和动态切入点:判断静态切入点只考虑类和方法。Spring只需第一次调用方法时判断表态切入点,不需要在每次调用方法
时判断。判断动态切入点则不仅需要类和方法,还需要调用方法的参数,因此,每一次调用方法都必须判断。常用的切入点是与正则表达式切入点。
1、Around处理
实现around处理需要实现MethodInterceptor接口(由AOP聪明提供),源代码如下:
[code]public interface MethodInterceptor extends Interceptor
{
Object invoke(MethodInvocation invocation) throws Throwable;
}[/code]
通过MethodInvocation可以执行目标方法,invoke返回调用的结果,即连接点的返回值。
2、Before处理
必须实现MethodBeforeAdvice接口,该接口的源代码如下:
[code]public interface MethodBeforeAdvice extends BeforeAdvice {
//参数分别是:执行的方法,调用方法的参数量和目标对象
void before(Method method, Object[] args, Object target) throws Throwable;
}[/code]
Before处理可以被用于任何类型的切入点。
3、After Returning处理
必须实现AfterReturnAdvice接口,源代码如下:
[code]public interface AfterReturningAdvice extends Advice {
/**
* @param returnValue 目标方法的返回值
* @param method 目标方法对象
* @param args 方法的参数
* @param target目标对象
*/
void afterReturning(Object returnValue, Method method, Object[] args, Object target)
throws Throwable;
}[/code]
4、throws处理:须实现ThrowsAdvice接口。
Introduction处理:须实现MethodIntercepto接口;不能作用于任何切入点,只作用于类层次,而不是方法层次。
5、拦截器的定义顺序很重要。拦截器前面的处理先被调用,链后面的处理后被调用。
6、ProxyFactoryBean的bean工厂:
如果目标类没有实现接口,需要对类生成代理,而不能为接口生代理。为类生成代理,需要使用CGLIB,而不能使用JDK动态代理。可以这么做:
[1]去掉<property name="proxyInterfaces">声明
[2]增加<preperty name="proxyTargetClass">子元素,并设其值为true。
另外,说明一下,在实现接口的情况也可强制使用CGLIB代理。
还有一点注意的是:
CGLIB代理是目标对象子类,必须考虑:
[1]目标类不能声明为final,因为final类不能被继承,无法生成代理
[2]目标方法也不能声明为final,final方法不能被重写,无法得到处理。
7、TransactionProxyFactoryBean其中的两个属性:preInterceptors,postInterceptors分别用来确定事务拦截器前后的拦截器链。
8、个人观点:提倡用BeanNameAutoProxyCreator,在管理事务的时候;不提倡用DefaultAdvisorAutoProxyCreator。
9、Advisor等于切入点加处理,是aspect的模块化的表示。除了Intorduction处理,Advisor可以被用于任何处理。DefaultPointcutAdvisor是最通用的Advisor类。