ITEEDU

Around Advice

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 的参考,定义档撰写如下:

•      beans‐config.xml
<?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 相同。