1. spring aop 和 AspectJ 的区别

    1. AspectJ 是一个java实现的AOP框架,它能够对java代码进行AOP编译(一般在编译期进行),让java代码具有AspectJ的AOP功能(当然需要特殊的编译器)
    2. ApectJ 采用的就是静态织入的方式。ApectJ主要采用的是编译期织入,在这个期间使用AspectJ的acj编译器 (类似javac )把 aspect 类编译成class字节码后,在java目标类编译时织入,即先编译aspect类再编译目标类。
    3. spring aop 采用动态代理技术的实现原理来构建 spring aop 的内部机制。
    4. Spring 只是使用了与 AspectJ 5 一样的注解,但仍然没有使用 AspectJ 的编译器,底层依是动态代理技术的实现,因此并不依赖于 AspectJ 的编译器
  2. 切入点指示符

    1. 通配符

      1. “ .. “ 匹配方法定义中的任意数量的参数,此外还匹配类定义中的任意数量包

        1
        2
        3
        4
        5
        6
        @Pointcut("execution(* com.cjm.spring.aop.springaop.UserDao.addUser(..))")
        private void myPointCut() {
        }
        @Pointcut("execution(* com.cjm.spring.aop..UserDao.addUser())")
        private void myPointCut1() {
        }
      2. “ + “ 匹配给定类的任意子类

        1
        2
        3
        @Pointcut("within(com.cjm.spring.aop.springaop.UserDao+)")
        private void myPointCut2() {
        }
      3. “ * “ 匹配任意数量的字符

        1
        2
        3
        4
        // 匹配以set开头, 参数为int 类型,任意返回值的方法
        @Pointcut("execution(* set*(int))")
        private void myPointCut4() {
        }
      4. 类型签名表达式 与 方法签名表达式

        1
        2
        3
        4
        5
        6
        7
        8
        // 类型签名表达式
        within(<type name>)
        // 方法签名表达式
        //scope :方法作用域,如public,private,protect
        //returnt-type:方法返回值类型
        //fully-qualified-class-name:方法所在类的完全限定名称
        //parameters 方法参数
        execution(<scope> <return-type> <fully-qualified-class-name>.*(parameters))
      5. 其他指示符:bean,this,target,@within,@annotation。

      6. 切点指示符可以使用运算符语法进行表达式的混编,如and、or、not(或者&& 、||、!)。