Java平台上的AOP实现机制

Java平台上的AOP实现机制

  1. 动态代理(Dynamic Proxy)机制,在运行期间动态的为相应接口生成对应的代理对象。SpringAop默认情况下采用这种机制来实现AOP机能。缺点:相对于编译后的静态类的执行,性能上可能略逊一筹。
  2. 动态字节码增强,通过ASM或者CGLIB等java工具库,在程序运行期间,动态构建字节码的class文件。在这样的技术前提下,我们可以为需要织入横切逻辑的模块类在运行期间,为这些系统模块类生成相应的子类。此技术不受限于接口。缺点:如果需要的扩展类中包含为final的实例方法的话,则无法对其进行子类化扩展。SpringAop在无法采用动态代理的时候,会使用CGLIB库的动态字节码增强支持来实现AOP功能的扩展。
  3. java代码生成,已过时。例:由EJB容器根据开发者描述信息,生成java代码,织入相应横切逻辑。
  4. 自定义类加载器,自定义类加载器通过读取外部描述信息,在加载class文件期间就可以将横切逻辑添加到系统模块类的现有逻辑中,然后将更改后的class文件交付给虚拟机。缺点:部分应用服务器无法完美支持自定义类加载器,所以会出现失效的可能性。
  5. AOL扩展,最强大也是最难掌握的方式,AspectJ就属于这种方式。

AOP相关概念

  1. Joinpoint,织入点
    • 方法调用
    • 方法调用执行
    • 构造方法调用
    • 字段设置
    • 字段获取
    • 异常处理执行
    • 类初始化(类中某些静态类型或者静态代码块的初始化点)
  2. Poincut,Joinpoint的表述方式。参照Poincut规定的Joinpoint信息,才会明确应该往系统的哪些Joinpoint织入横切逻辑。Poinpoint表述方式:
    • 直接指定Joinpoint所在方法名称。
    • 正则表达式
    • 使用特定的Poincut表述语言
      Poincut运算,如下举例:

3.Advice,横切关注点逻辑的载体。它代表即将织入Joinpoint的横切载体。

按照advice在Joinpoint位置执行时的差异或者完成功能的不同,Advice可以分成多种形式:

  • Before Advice:在Joinpoint指定位置之前执行的Advice类型。多用来做一些系统初始化工作
  • After Advice:在相应连接点之后执行。该种形式又可以细划分为:
原文地址:https://www.cnblogs.com/wzk1992/p/8910051.html