After Advice 会 在 目 标 方 法 执 行 之 前 被 呼 叫 , 您 可 以 实 现 org.springframework.aop.AfterReturningAdvice 介面 来 实作 After Advice 的逻辑 , AfterReturningAdvice 介面于 Spring 中的定义如下:
package org.springframework.aop; public interface AfterReturningAdvice extends Advice { void afterReturning(Object returnValue, Method m, Object[] args, Object target) throws Throwable; }
AfterReturningAdvice直接继承自Advice介面,afterReturning()当中传入的引数有目标方法的返回值、 方法实例、 引数、与目标物件,afterReturning()方法传回void,若您要中止接下来的应用程式流 程,丢出例外是唯一的方式。
可以在 Before Advice 中 介绍的 例子 当中, 为 HelloSpeaker 的 hello() 方 法呼 叫之后 ,加 上 AfterReturningAdvice,首先定义一个LogAfterAdvice类别来实作AfterReturningAdvice介面:
• LogAfterAdvice.java
package onlyfun.caterpillar; import java.lang.reflect.Method; import java.util.logging.Level; import java.util.logging.Logger; import org.springframework.aop.AfterReturningAdvice; public class LogAfterAdvice implements AfterReturningAdvice { private Logger logger = Logger.getLogger(this.getClass().getName()); public void afterReturning(Object object, Method method, Object[] args, Object target) throws Throwable { logger.log(Level.INFO, "method ends..." + method); } }
接着只要在 beans‐config.xml 中增加 After Advice 的实例,以及在 ProxyFactoryBean 中的 "interceptorNames"增加对 LogAfterAdvice 的参考,定义档撰写如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN""http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="logBeforeAdvice" class="onlyfun.caterpillar.LogBeforeAdvice"/> <bean id="logAfterAdvice" class="onlyfun.caterpillar.LogAfterAdvice"/> <bean id="helloSpeaker" class="onlyfun.caterpillar.HelloSpeaker"/> <bean id="helloProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces"> <value>onlyfun.caterpillar.IHello</value> </property> <property name="target"> <ref bean="helloSpeaker"/> </property> <property name="interceptorNames"> <list> <value>logBeforeAdvice</value> <value>logAfterAdvice</value> </list> </property> </bean> </beans>
在定义中,除了之前设定的LogBeforeAdvice之外,还加入了LogAfterAdvice的记录服务,其它的程 式与 Before Advice 相同。