Spring AOP系列之4:前置通知
Spring AOP系列之四:前置通知
通过实现org.springframework.aop.MethodBeforeAdvice来完成前置通知:
Spring配置文件beans-before-advice.xml
测试:
输出:
Welcome to the car shop
Car name: Superb, price: 220000
附:
info()调用的时候,调用org.springframework.aop.framework.adapter.MethodBeforeAdviceAdapter类的getInterceptor方法:
然后调用org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor的invoke方法:
通过实现org.springframework.aop.MethodBeforeAdvice来完成前置通知:
public class CarBeforeAdvice implements MethodBeforeAdvice { @Override // method 目标类方法,args 方法参数,target 目标对象 public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println("Welcome to the car shop"); } }
Spring配置文件beans-before-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="carBeforeAdvice" class="com.john.spring.aop.CarBeforeAdvice" /> <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>carBeforeAdvice</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-before-advice.xml" }); Vehicle vehicle = (Vehicle) ctx.getBean("proxyBean"); vehicle.info(); }
输出:
Welcome to the car shop
Car name: Superb, price: 220000
附:
info()调用的时候,调用org.springframework.aop.framework.adapter.MethodBeforeAdviceAdapter类的getInterceptor方法:
class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable { public boolean supportsAdvice(Advice advice) { // 是否支持指定通知 return (advice instanceof MethodBeforeAdvice); } public MethodInterceptor getInterceptor(Advisor advisor) { MethodBeforeAdvice advice = (MethodBeforeAdvice) advisor.getAdvice(); // 获取通知 return new MethodBeforeAdviceInterceptor(advice); } }
然后调用org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor的invoke方法:
public Object invoke(MethodInvocation mi) throws Throwable { this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis() ); // 前置通知实现类的before方法。这里是CarBeforeAdvice类的实例 return mi.proceed(); // 目标类方法的执行。这里是info()。 }