美文网首页
Spring AOP

Spring AOP

作者: 月明飞 | 来源:发表于2016-03-07 23:56 被阅读0次

Spring AOP是代理模式的经典实现,代理模式的作用就是把一些目标类没有的功能附加到代理类上,然后在代理类上执行目标类的方法,这给客户端的一个假象,好像这些新加功能在本来就在目标类上。Spring AOP使用的动态代理技术,JDK和CGLIB,Spring AOP优先选择JDK,假如不符合JDK代理的要求(目标类必须实现一个接口),就会尝试使用CGLIB,如果再不符合CGLIB的要求(目标类不能是final类型),那么就不能使用Spring AOP技术。下面是一个基于XML配置的一个简单但不是有用的例子。

  1. 目标类代码
    public interface Mobile {
    public void call();
    }

     public class Xiaomi implements Mobile{
       @Override
       public void call() {
          System.out.println("小米手机打电话");
       }
     }
    
  2. 切面类代码
    public class MobileAspect {
    //一个前置通知
    public void before(){
    System.out.println("开机");
    }
    }

  3. XML配置
    <bean id="xiaomi" class="annotation.Xiaomi"/>
    <bean id="aspect" class="annotation.MobileAspect"/>
    <aop:config>
    <aop:pointcut expression="execution(* annotation.Xiaomi.*(..))" id="pointcut"/>
    <aop:aspect ref="aspect">
    <aop:before method="before" pointcut-ref="pointcut"/>
    </aop:aspect>
    </aop:config>

  4. 测试类代码:
    public class AopAnnotationDemo {
    public static void main(String[] args){
    ApplicationContext context = new ClassPathXmlApplicationContext("spring-introduction.xml");
    Mobile mi = (Mobile) context.getBean("xiaomi");
    System.out.println(mi.getClass().getSimpleName());//输出的是$Proxy2,说明我们调用不是Xiaomi类的对象,而是JDK动态代理生成的代理类,这个代理类在执行Xiaomi类对象上的方法时,会想执行切面类中的before()方法。
    mi.call();
    }
    }

Spring AOP也支持注解的方式。

相关文章

网友评论

      本文标题:Spring AOP

      本文链接:https://www.haomeiwen.com/subject/waqzkttx.html