8 -- 深入使用Spring -- 4...2 使用AspectJ实现AOP

      8.4.2 使用AspectJ实现AOP

        AspectJ是一个基于Java语言的AOP框架。Spring 4.0 的AOP对AspectJ很好的集成。

        AspectJ是Java 语言的一个AOP实现,其主要包括两个部分:一个部分定义了如何表达、定义AOP编程中的语法规范,通过这套语法规范,可以方便地用AOP来解决Java语言中存在的交叉关注点 的问题;另一个部分是工具部分,包括编译器、调试工具等。

        1. 下载和安装AspectJ:java -jar aspectj-x.x.x.jar

        2.AspectJ使用入门

          ⊙ bin : 该路径下存放了aj、aj5、ajc、ajdoc、ajbrowser等命令,其中ajc命令最常用,它的作用类似于javac,用于对普通的Java类进行编译时增强。

          ⊙ docs : 该路径下存放了AspectJ的使用说明、参考手册、API文档等文档。

          ⊙ lib : 该路径下的4个JAR文件是AspectJ的核心类库。

          ⊙ 相关授权文件。

          Class : Hello

package edu.pri.lime._8_4_2.service;

public class Hello {

    public void foo(){
        System.out.println("执行Hello组件的foo()方法...");
    }
    public int addUser(String name,String pass){
        System.out.println("执行Hello组件的addUser()添加用户 : " + name);
        return 20;
    }
}

          Class : World

package edu.pri.lime._8_4_2.service;

public class World {

    public void bar(){
        System.out.println("执行World组件的bar()方法...");
    }
}

          Class : AspectJTest

package edu.pri.lime._8_4_2.service;

public class AspectJTest {

    public static void main(String[] args) {
        
        Hello hello = new Hello();
        hello.foo();
        hello.addUser("lime", "7878,");
        World world = new World();
        world.bar();
    }
}

          AspectJ : AuthAspect

package edu.pri.lime._8_4_2.service;

public aspect AuthAspect {

//   在所有业务方法之前执行
//   指定在执行edu.pri.lime._8_4_2.service包中任意类的任意方法之前执行下面代码块
//   * : 返回值不限;* :类名不限; * : 方法名不限;(..) : 任意个数、类型不限的形参

    before() : execution(* edu.pri.lime._8_4_2.service.*.*(..)){

        System.out.println("模拟进行权限检查...");
    }
}

          AspectJ : LogAspect

package edu.pri.lime._8_4_2.service;

public aspect LogAspect {

//    定义一个Pointcut,其名为logPointcut
//    该Pointcut代表了后面给出的切入点表达式,这样可复用该切入点表达式
    pointcut logPointcut() : execution(* edu.pri.lime._8_4_2.service.*.*(..));
    after() : logPointcut(){
        System.out.println("模拟记录日志...");
    }
}

          AspectJ : TxAspect

package edu.pri.lime._8_4_2.service;

public aspect TxAspect {

//    指定执行Hello.sayHello()方法时执行下面的代码块
    Object around():call(* edu.pri.lime._8_4_2.service.*.*(..)){
        System.out.println("模拟开启事务...");
//        回调原来的目标方法
        Object rvt = proceed();
        System.out.println("模拟结束事务...");
        return rvt;
    }
}

          AOP实现可分为两类(按AOP框架修改源代码的时机)

            ⊙ 静态AOP实现 : AOP框架在编译阶段对程序进行修改,即实现对目标类的增强,生成讲台的AOP代理类(生成的*.class 文件已经被改掉了,需要使用特定的编译器).以AspectJ为代表。

            ⊙ 动态AOP实现 : AOP框架在运行阶段动态生成AOP代理(在内存中以JDK动态代理或cglib动态第生成AOP代理类),以实现对目标对象的增强。以Spring AOP为代表。

          一般来说,静态AOP实现具有较好的性能,但需要使用特殊的编译器。动态AOP实现是纯Java实现,因此无须特殊的编译器,但是通常性能略差。

啦啦啦

啦啦啦

啦啦啦

啦啦啦

啦啦啦

posted @ 2017-02-15 20:32  limeOracle  阅读(361)  评论(0编辑  收藏  举报