循序渐进之Spring AOP(4) - Introduction
前面描述的几种增强(Advice)都是在目标方法范围内织入,而引介(Introduction)不同,直接在类级别上添加目标未实现的接口方法。
在Spring中可以通过扩展DelegatingIntroductionInterceptor类来实现引介增强类。
下面通过这种方式给一辆普通汽车加上无人驾驶功能
接口Auto
public interface Auto { void driving(); }实现类
public class MyCar implements Auto { @Override public void driving() { System.out.println("开车了"); } }新建一个接口Intelligent,它具有一个自动驾驶的方法,我们将把这个方法"添加"到MyCar上
public interface Intelligent { void selfDriving(); }实现类IntelligentCar,注意,继承了DelegatingIntroductionInterceptor类
public class IntelligentCar extends DelegatingIntroductionInterceptor implements Intelligent { @Override public void selfDriving() { System.out.println("开启无人驾驶了, 别挡路"); } public Object invoke(MethodInvocation invocation) throws Throwable { Object obj = super.invoke(invocation); return obj; } }applicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <bean id="carTarget" class="demo.aop.MyCar" /> <bean id="introduceAdvisor" class="org.springframework.aop.support.DefaultIntroductionAdvisor"> <constructor-arg> <bean class="demo.aop.IntelligentCar" /> </constructor-arg> </bean> <bean id="myCar" class="org.springframework.aop.framework.ProxyFactoryBean" p:target-ref="carTarget" p:interceptorNames="introduceAdvisor" p:proxyTargetClass="true" /> </beans>测试代码
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Auto car = (Auto)context.getBean("myCar"); car.driving(); Intelligent intelligentCar = (Intelligent)car; intelligentCar.selfDriving(); }运行结果
开车了 开启无人驾驶了, 别挡路