美文网首页
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