zoukankan      html  css  js  c++  java
  • 循序渐进之Spring AOP(4)

    前面描述的几种增强(Advice)都是在目标方法范围内织入,而引介(Introduction)不同,直接在类级别上添加目标未实现的接口方法。

    spring中可以通过扩展DelegatingIntroductionInterceptor类来实现引介增强类。

    下面通过这种方式给一辆普通汽车加上无人驾驶功能

    接口Auto

    [html] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. public interface Auto {  
    2.     void driving();  
    3. }  

    实现类

    [html] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. public class MyCar implements Auto {  
    2.     @Override  
    3.     public void driving() {  
    4.         System.out.println("开车了");  
    5.     }  
    6. }  

    新建一个接口Intelligent,它具有一个自动驾驶的方法,我们将把这个方法"添加"到MyCar上

    [html] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. public interface Intelligent {  
    2.     void selfDriving();  
    3. }  

    实现类IntelligentCar,注意,继承了DelegatingIntroductionInterceptor类

    [html] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. public class IntelligentCar extends DelegatingIntroductionInterceptor implements Intelligent {  
    2.   
    3.     @Override  
    4.     public void selfDriving() {  
    5.         System.out.println("开启无人驾驶了, 别挡路");  
    6.     }  
    7.   
    8.     public Object invoke(MethodInvocation invocation) throws Throwable {  
    9.         Object obj = super.invoke(invocation);  
    10.         return obj;  
    11.     }  
    12. }  

    applicationContext.xml

    [html] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. <beans xmlns="http://www.springframework.org/schema/beans"  
    2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
    3.     xmlns:aop="http://www.springframework.org/schema/aop"  
    4.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
    5.   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
    6.   http://www.springframework.org/schema/aop  
    7.   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">  
    8.   
    9.     <bean id="carTarget" class="demo.aop.MyCar" />  
    10.     <bean id="introduceAdvisor" class="org.springframework.aop.support.DefaultIntroductionAdvisor">  
    11.         <constructor-arg>  
    12.             <bean class="demo.aop.IntelligentCar" />  
    13.         </constructor-arg>  
    14.     </bean>  
    15.     <bean id="myCar" class="org.springframework.aop.framework.ProxyFactoryBean"  
    16.         p:target-ref="carTarget"  
    17.         p:interceptorNames="introduceAdvisor"  
    18.         p:proxyTargetClass="true" />  
    19. </beans>  

    测试代码

    [html] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. public static void main(String[] args) {  
    2.     ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");  
    3.   
    4.     Auto car = (Auto)context.getBean("myCar");  
    5.     car.driving();  
    6.     Intelligent intelligentCar = (Intelligent)car;  
    7.     intelligentCar.selfDriving();  
    8. }  

    运行结果

    [html] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. 开车了  
    2. 开启无人驾驶了, 别挡路  
  • 相关阅读:
    Redis安装过程
    TDDL-剖析淘宝TDDL
    jQuery 遍历
    util-C# 复杂条件查询(sql 复杂条件查询)查询解决方案
    util-判断当前年份所处的季度,并返回当前季度开始的月份
    省市区(县)三级联动代码(js 数据源)
    JS:实用功能
    C#常用格式输出
    算术运算符
    C# 中的结构类型(struct type)
  • 原文地址:https://www.cnblogs.com/sa-dan/p/6837197.html
Copyright © 2011-2022 走看看