Spring 的后置通知虽然如其名字那样,通知在方法调用之后织入。但准确的说,通知是在方法返回值之后和方法返回到调用地点之前被织入。我们可以通过Spring 自带的AfterReturningAdvice 接口轻松的实现方法的织入。AfterReturningAdvice 接口提供了afterReturning 方法来实现通知,即在afterReturning 方法中定义通知。afterReturning 方法接受目标方法的返回值,目标方法,目标方法需要的参数和目标对象。从参数列表中我们可以知道我们无法再对目标方法的返回值进行更改(如果需要对目标方法的返回值进行更改可以通过MehtodInterceptor 接口来实现)。
PS:如果目标方法没有返回值,那么afterReturning 方法接受到的目标方法返回值为null,并不抛出异常。
例子如下:
1)后置通知代码
public class After implements AfterReturningAdvice
{
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) {
System.out.println("After.afterReturning()");
System.out.println("return value: " + returnValue);
System.out.println("method name: " + method.getName());
Type[] type = method.getGenericParameterTypes();
for(int i = 0; i < type.length; i++) {
System.out.println(type[i].toString() + ": " + args[i]);
}
System.out.println("target: " + target.toString());
//返回值更改
//无效
returnValue = new String("after");
System.out.println("");
}
}
2)目标对象
public class Target implements Advice
{
public String test(int i, String s, float f) {
System.out.println("Target.test()");
System.out.println("target: " + this);
StringBuffer buf = new StringBuffer();
buf.append( "i = " + i);
buf.append( ", s = \"" + s + "\"");
buf.append( ", f = " + f);
return buf.toString();
}
}
3)接口定义
public interface Advice
{
String test(int i, String s, float f);
}
4)配置文件
<beans> <bean id="after" class="spring.After"/> <bean id="aop" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces" value="spring.Advice" /> <property name="interceptorNames"> <list> <value>after</value> </list> </property> <property name="target"> <bean class="spring.Target" /> </property> </bean> </beans>