Spring揭秘-AOP

  1. AOP的实现机制
    Spring AOP默认使用动态代理实现AOP机制,在运行期间为相应的接口生成对应的代理对象,当Spring AOP无法用动态代理实现时,它会使用CGLIB库的动态字节码增强支持实现AOP机制,动态字节码增强不像动态代理受限于必须实现对应的接口,他通过织入横切逻辑到模块类(final修饰的类除外)的子类实现。还有一种实现机制自定义类加载器,所有的class都需要加载到jvm中才能运行,自定义的类加载器在加载的过程中织入横切逻辑,然后将改动后的class交给jvm。
  2. AOP框架的组成
  • Joinpoint
    程序执行过程中的任意任何时点都可以是Joinpoint,常见的Joinpoint有方法调用、方法执行、构造方法调用、构造方法执行、字段设置、字段获取、异常处理执行、类初始化等,Spring只支持方法执行的Joinpoint。

  • Pointcut
    Pointcut可以理解为是Joinpoint的表述方式,织入器通过Pointcut才能知道需要织入的Joinpoint。

  • Advice
    Advice是被织入Joinpoint的横切逻辑,按照Advice在Joinpoint位置执行的差异,Advice可以分为多种具体形式。

    • Before Advice
    • After Advice
    • Around Advice
  • Aspect
    Aspect是对系统中横切关注点逻辑进行模块化封装的AOP概念实体,通常Aspect可以包含多个Pointcut和Advice。

  • 织入器
    织入器负责把Aspect织入到OOP系统中,各平台实现织入器的方式不一,Spring AOP通过ProxyFactory实现织入器。


    Spring揭秘-AOP_第1张图片
    AOP组成间的联系
  1. Spring AOP实现Advice


    Spring揭秘-AOP_第2张图片
    AOP类图
  2. AspectJ形式Pointcut表达
    execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throw-pattern?)
    例子:execution(public void Foo.set(String) throws Exception)
    用问号标志的可以省略execution(void set(String))。可以使用通配符*和..
  • 通配符(×)可以匹配任意部分的字符,比如execution(* set(*))可以匹配方法名为set,有一个参数的所有方法。
  • ..可以用于declaring-type-pattern和param-pattern。用于declaring-type-pattern上,可以匹配当前包及其子包下的所有类型,否则只能匹配当前包下的类型。用于param-pattern上,表示该方法有0到多个参数,参数类型不限。

代理和AOP调用demo代码

你可能感兴趣的:(Spring揭秘-AOP)