Spring AOP系列之5:后置通知
Spring AOP系列之五:后置通知
和前置通知类似,
通过实现org.springframework.aop.AfterReturningAdvice来完成后置通知:
Spring配置文件beans-after-advice.xml
测试:
输出:
Car name: Superb, price: 220000
Welcome to come again
附:
执行info()时,调用org.springframework.aop.framework.adapter.AfterReturningAdviceAdapter的getInterceptor方法:
然后调用org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor的invoke方法:
和前置通知类似,
通过实现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; }