概述 实例
后置增强在目标方法调用后执行.
例如上面的例子中,在服务生每次服务后,也需要向客人问候,可以通过后置增强来实施这一要求,步骤如下:
创建业务接口类:Waiter.java
创建业务实现类:NativeWaiter.java
创建业务增强类:GreetingAfterAdvice.java
创建配置文件:conf-advice.xml
创建增强测试类:AfterReturingAdviceTest.java
业务接口类
package com.xgj.aop.spring.advice.afterRetruingAdivce; public interface Waiter { void greetTo(String name); void serverTo(String name); }
业务实现类
package com.xgj.aop.spring.advice.afterRetruingAdivce; public class NaiveWaiter implements Waiter { @Override public void greetTo(String name) { System.out.println("greetTo " + name); } @Override public void serverTo(String name) { System.out.println("serverTo " + name); } }
业务增强类
package com.xgj.aop.spring.advice.afterRetruingAdivce; import java.lang.reflect.Method; import org.springframework.aop.AfterReturningAdvice; public class GreetingAfterAdvice implements AfterReturningAdvice { /** * 后置增强代码实现,在目标方法执行后调用 * * @param returnValue * 代理返回对象 * @param method * 目标对象方法 * @param args * 目标对象方法参数 * @param target * 目标对象 * @throws Throwable */ @Override public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { System.out.println("please enjoy youself,Sir!"); } }
在配置文件中对其进行配置
interceptorNames 是String[]类型的,它接收增强Bean的名称而非增强Bean的实例。这是因为ProxyFactory内部在省城代理类时,需要使用增强Bean得嘞,而非增强Bean的实例,以织入增强类中所写的横切代码逻辑。
测试类
package com.xgj.aop.spring.advice.afterRetruingAdivce; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class AfterReturingAdviceTest { @Test public void test() { ApplicationContext ctx = new ClassPathXmlApplicationContext( "classpath:com/xgj/aop/spring/advice/afterRetruingAdivce/conf-advice.xml"); Waiter waiter = ctx.getBean("waiter", Waiter.class); waiter.greetTo("Xiao"); waiter.serverTo("GongJiang"); } }
运行结果
可以看到,前置、后置增强中的逻辑都成功的织入到目标类NaiveWaiter方法所对应的连接点上。