前面写了一个前置增强,后置增强的小demo,前置增强即在方法调用前对方法增强;后置增强即在方法调用后对方法增强。环绕增强允许在目标类方法调用前后织入横切逻辑,它综合了前置、后置增强两者的功能。
还继续沿用之前的代码,这里介绍环绕增强的实现类和测试类。
环绕增强类
GreetingAroundAdvice.java
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() 反射调用目标实例相应的方法。通过在实现类中定义横切逻辑,很容易实现方法的前后置的增强。
测试类
TestAdvice.java
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!
时间: 2024-11-07 23:49:30