SpringAOP 增强

AOP步骤
通过切点和增强定位到连接点上
在增强中编写切面代码

Spring增强类型
前置增强 - org.springframework.aop.BeforeAdvice(MethodBeforeAdvice可用)
后置增强 - org.springframework.aop.AfterReturningAdvice
环绕增强 - org.springframework.intercept.MethodInterceptor
异常抛出增强 - org.springframework.aop.ThrowsAdvice
引介增强 - org.springframework.aop.IntroductionInterceptor

ProxyFactoryBean配置代理
<bean id="myAdvice" class="com.test.MyBeforeAdvice" />
<bean id="target" class="com.test.NativeWaiter" />
<bean id="waiter" class="com.springframework.aop.framework.ProxyFactoryBean"
p:proxyInterfaces="com.test.Waiter"
p:interceptorNames="myAdvice"
p:target-ref="target"
/>

ProxyFactoryBean常用属性
target 目标类
proxyInterface 代理接口列表
interceptorNames 增强列表
singleton 返回的代理是否是单实例,默认单实例
optimize 为true时,强制使用CGLib代理
proxyTargetClass 是否对类进行代理,为true时,使用CGLib代理

前置增强
public class MyBeforeAdvice implements MethodBeforeAdvice{
    public void before(Method method, Object[] args, Object obj) throws Throwable{//...}
}
method 目标类方法
args 目标方法入参
obj 目标类实例
before()方法发生异常时,将阻止目标类方法的执行

后置增强
public class MyAfterAdvice implements AfterReturningAdvice{
    public void afterReturning(Object returnObj, Method method,Object[] args,Object obj) throws Throwable{//...}
}
returnObj 目标类返回结果
method 目标类方法
args 目标方法入参
obj 目标类实例
afterReturning抛出异常时,如果是目标方法声明的异常,则归并到目标方法中;如果不是目标方法声明的异常,Spring将其转为运行时异常抛出

环绕增强
public class MyInterceptor implements MethodInterceptor{
    public Object invoke(MethodInvocation invocation) throws Throwable{
        Object[] args = invocation.getArguments();
        //...
        Object obj = invocation.proceed();
        //...
        return obj;
    }
}

异常抛出增强
public class MyThrowsAdvice implements ThrowsAdvice{
    public void afterThrowing(Method method, Object[] args, Object target, Exception e) throws Throwable{//...}
}
ThrowsAdvice是一个接口标识,未定义任何方法
增强方法的签名必须是void afterThrowing(Method method,Object[] args, Object target, Throwable e)
Object target为可选(要么3个入参,要么0个入参)
可以定义多个afterThrowing()

猜你喜欢

转载自csolar.iteye.com/blog/2153764