标签:spring aop 环绕增强 methodinterceptor
前面写了一个前置增强,后置增强的小demo,前置增强即在方法调用前对方法增强;后置增强即在方法调用后对方法增强。环绕增强允许在目标类方法调用前后织入横切逻辑,它综合了前置、后置增强两者的功能。
还继续沿用之前的代码,这里介绍环绕增强的实现类和测试类。
package com.paic.zhangqi.spring.aop;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class GreetingAroundAdvice implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
// 获取目标方法入参
Object[] args = invocation.getArguments();
String clientName = (String)args[0];
// 目标方法调用前执行
System.out.println("How are you!Mr."+clientName+".");
// 通过反射机制调用目标方法
Object obj = invocation.proceed();
// 目标方法调用后执行
System.out.println("Please enjoy yourself!");
return obj;
}
}
环绕增强的代码和前面前置增强代码有一个不同处,所实现的接口包路径改变了。前置增强、后置增强实现的接口在org.springframework.aop 路径下,而环绕增强类需要实现org.aopalliance.intercept.MethodInterceptor
接口。这个接口不是 Spring 提供的,它是 AOP 联盟写的,Spring 只是借用了它。该接口拥有唯一的接口方法Object invoke(MethodInvocation invocation) throws Throwable ,MethodInvocation 不但封装目标方法及其入参数组,还封装了目标方法所在的实例对象,通过MethodInvocation 的 getArguments() 方法可以获取目标方法的入参数组,通过proceed() 反射调用目标实例相应的方法。通过在实现类中定义横切逻辑,很容易实现方法的前后置的增强。
package com.paic.zhangqi.spring.aop;
import org.aopalliance.intercept.MethodInterceptor;
import org.springframework.aop.framework.ProxyFactory;
public class TestAdvice {
public static void main(String[] args) {
Waiter target = new NaiveWaiter();
// 环绕增强类
MethodInterceptor aroundAdvice = new GreetingAroundAdvice();
// spring 提供的代理工厂
ProxyFactory pf = new ProxyFactory();
// 设置代理目标
pf.setTarget(target);
// 为代理目标添加增强
pf.addAdvice(aroundAdvice);
// 生成代理实例
Waiter proxy = (Waiter)pf.getProxy();
proxy.greetTo("John");
proxy.serveTo("Tomcat");
}
}
log4j:WARN No appenders could be found for logger (org.springframework.aop.framework.CglibAopProxy). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. How are you!Mr.John. greet to John... Please enjoy yourself! How are you!Mr.Tomcat. serving Tomcat... Please enjoy yourself!
标签:spring aop 环绕增强 methodinterceptor
原文地址:http://blog.csdn.net/magi1201/article/details/45933095