AspectWerkz

      AspectWerkz是一个动态的AOP框架,利用对字节码的修改实现方面的织入,并使用Java虚拟机的动态替换字节码的能力实现动态AOP的要求。

      AspectWerkz没有扩展Java语言,方面、参考、切入点等均使用标准的Java构造块,即以及方法来实现,并使用XML文件定义这些构造块,此外 AspectWerkz还支持使用JavaDoc标记实现的运行期属性定义。AspectWerkz采用了与AspectJ相似的连接点模型,只是支持的连接点种类少于AspectJ,参考的类型一致。

      AspectWerkz通过引入一个间接层,方面容器(Aspect Container)以及对字节码的转化,即代码织入实现动态AOP的要求,方面容器管理部署好的类、方面代码,并根据XML文件或JavaDoc注释中定义的方面,参考,切入点等得到连接点处相关的方面信息,并在程序的执行中控制执行流程,在匹配的连接点处执行适当的参考。

      AspectWerkz通过类载入层次的适当位置拦截类载入从而实现字节码的修饰。AspectWerkz提供了两种织入模式实现AOP:静态织入以及动态织入。静态织入只在类载入时对字节码作一次性的转化,通过将类的方法实现移入AspectWerkz命名的方法中,将原方法中的代码改写,由方面容器调用适当的参考,并调用前述AspectWerkz添加的方法从而完成代码的织入。导入则由混合类型(Mixin)实现,用于为类增加新的方法,混合类型是一种使用接口与实现类的方式模拟多重继承的机制。AspectWerkz通过修改字节码使被导入的类实现混合类型的接口,并在接口定义的方法中,将控制交给容器管理器,由它来完成对实现的调用。静态织入可以在运行时动态的为切入点增加,删除参考,可以引入新的参考,但是无法定义新的切入点,这需要动态织入。动态织入由两阶段织入完成,分别为类载入阶段与激活阶段。首先,在类载入时,按照静态织入的方法,为需要实现动态织入的类的每个方法添加一个相应的空的方法,匹配连接点的方法除外。然后,在激活阶段,原方法体中的代码将被交换到类载入时新产生的方法中,原方法将实现静态织入时相同的处理,从而方面容器控制流程。前述代码交换是由热交换(HotSwap)实现的,这是JVM提供的API。通过方面容器与织入模型,AspectWerkz提供了动态AOP的实现。

      基于Java的简单、动态、轻量级、强大的AOP框架。既强大又简单,有助于更容易的集成AOP到新的或已存在的项目中。

AspectWerkz 主要特性

      1. 运行时和加载时字节码修正:你可以在运行时或编译时轻松的改造任何(旧)应用程序或除了rt.jar以外的外部类库
      2. 支持join point模型
      3. 支持Annotation:匹配JavaDoc和JSR-175,支持用户自定义Annotation
      4. 支持部署多个Aspect定义文件到部署的应用程序(WEB-INF/aop.xml、META-INF/aop.xml)
      5. Introduction/内类型声明(也称Mixin),也就是具有添加接口和实现到已存在的类中的能力
      6. Annotation定义:定义Aspect使用的运行时Annotation(为JSR-175准备)
      7. XML定义:定义Aspect使用的XML;XML可以用来精炼、改写和解析Annotation定义
      8. 插件式Aspect管理器能够和IoC框架(如Spring或PicoContainer)一起工作
      9. 四种不同的Advice和Introduction部署模型(范围):perJVM(单模式)、 perClass、perInstance 和perThread
      10. Advice和Introduction能够动态部署、反部署或重新部署
      11. 高性能,使用JIT编译
      12. 使用Fine-grained模式语言选择join point
      13. 所有Advice能够和所有的join point和各种混合类型的pointcut
      14. 脱机变换(可以用作后处理器)
      15. Aspect、Advice和Introduction使用POJO编码
      16. 目标类可以是正规的POJO,也就是不需要接口
      17. 支持通过定义传递参数给Advice和定义可重用的Advice堆栈
      18. 元数据被加到类中
      19. 简单的用法和配置

 

 

中程在线