Spring AOP系列之五:后置通知

和前置通知类似,
通过实现[color=red]org.springframework.aop.AfterReturningAdvice[/color]来完成后置通知:


public class CarAfterAdvice implements AfterReturningAdvice {

@Override
// returnValue 方法返回值,其它和前置通知相同
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println("Welcome to come again");
}
}


Spring配置文件beans-after-advice.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
default-autowire="byName">

<bean id="car" class="com.john.spring.aop.Car">
<property name="name" value="Superb" />
<property name="price" value="220000" />
</bean>

<bean id="carAfterAdvice" class="com.john.spring.aop.CarAfterAdvice" />

<bean id="proxyBean" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.john.spring.aop.Vehicle</value>
</property>
<property name="interceptorNames">
<list>
<value>carAfterAdvice</value>
</list>
</property>
<property name="target">
<ref bean="car" />
</property>
</bean>
</beans>


测试:

public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[] { "beans-after-advice.xml" });
Vehicle vehicle = (Vehicle) ctx.getBean("proxyBean");
vehicle.info();
}


输出:
Car name: Superb, price: 220000
Welcome to come again


附:
执行info()时,调用org.springframework.aop.framework.adapter.AfterReturningAdviceAdapter的getInterceptor方法:

public MethodInterceptor getInterceptor(Advisor advisor) {
AfterReturningAdvice advice = (AfterReturningAdvice) advisor.getAdvice(); // 获取后置通知实例
return new AfterReturningAdviceInterceptor(advice);
}


然后调用org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor的invoke方法:

public Object invoke(MethodInvocation mi) throws Throwable {
Object retVal = mi.proceed(); // 执行目标方法
this.advice.afterReturning(retVal, mi.getMethod(), mi.getArguments(), mi.getThis()); // 执行后置通知方法
return retVal;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值