`

Spring AOP系列之五:后置通知

阅读更多
和前置通知类似,
通过实现org.springframework.aop.AfterReturningAdvice来完成后置通知:

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;
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics