zoukankan      html  css  js  c++  java
  • 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实现,因此无须特殊的编译器,但是通常性能略差。

    啦啦啦

    啦啦啦

    啦啦啦

    啦啦啦

    啦啦啦

  • 相关阅读:
    Ubuntu上安装Redis
    Unity Shader中将指定颜色过滤成透明
    用Python发送邮件
    Flask搭建简单的服务器
    SQLServer 中All、Any和Some用法与区别
    Linux探秘之用户态与内核态
    MTDDL 美团点评分布式数据访问层中间件
    基础数据结构 例:栈、队列、链表、数据、字典、树、等
    二叉树、红黑树、B&B+树数据结构
    CPU,GPU,高速缓存cache,内存RAM,虚拟内存VM,磁盘ROM,磁盘缓存之间的关系
  • 原文地址:https://www.cnblogs.com/ClassNotFoundException/p/6403267.html
Copyright © 2011-2022 走看看