0
点赞
收藏
分享

微信扫一扫

Aspectwerkz动态实现AOP

Aspectwerkz动态实现AOP

 目前最成熟、功能最丰富的AOP框架当数AspectJ,AspectJ已成为大多数其它框架跟从的标准。但是,AspectJ也走出了非同寻常的一步,它的实现为Java语言增添了新的关键词。虽然新的语法并不难学,但却意味着我们必须换一个编译器,还要重新配制编辑器,只有这样才能适应新的语法。在规模较大的开发组中,这些要求可能难以办到,因为整个开发小组都会受到影响。由于语言本身的变化,开发小组把AOP技术引入到现有项目的学习周期随之延长。


 现在我们需要的是这样一个框架,它可以方便地引入,且不会对原来的开发和构造过程产生任何影响。满足这些要求的框架不止一个,例如JBoss AOP、Nanning、Aspectwerkz(AW)。本文选用的是Aspectwerkz,因为它可能是最容易学习的框架,也是最容易集成到现有项目的框架。


   Aspectwerkz由Jonas Boner和Alexandre Vasseur创建,它是目前最快速、功能最丰富的框架之一。虽然它还缺乏AspectJ的某些功能,但己足以满足大多数开发者在许多情形下的需要。


   Aspectwerkz最令人感兴趣的特性之一是它能够以两种不同的模式运行:联机模式和脱机模式。在联机模式下,AW直接干预属于JVM的底层类装入机制,截取所有的类装入请求,对字节码实施即时转换。AW提供了干预类装入过程的许多选项,另外还有一个替代bin/java命令的封装脚本,这个脚本能够根据Java版本和JVM能力自动生成一组可运行的配制。对于开发者,联机模式有许多优点,它能插入到任何类装入器并在类装入期间生成新的类。也就是说,我们不必手工修改应用程序的类,只要按通常的方式部署即可。不过,联机模式要求对应用服务器进行额外的配制,有时这一要求可能很难满足。


 在脱机模式下,生成类需要二个步骤。第一步是用标准的编译器编译,第二步是重点——以脱机模式运行AWcompiler编译器,让它处理新生成的类。编译器将修改这些类的字节码,根据一个XML文件的定义,在适当的point-cut插入advice。脱机模式的优点是AWcompiler生成的类能够在任何JVM 1.3以上的虚拟机运行,本文下面要用的就是这种模式,因为它不需要对Tomcat作任何修改,只要对构造过程稍作修改就可以照搬到大多数现有的项目。


 


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.简单的用法和配置



开始AOP



1)这里我们要在屏幕打印出“Hello AOP!”,看如下代码:


//HelloAOP.java

public class HelloAOP {

public static void main(String args[]) {

HelloAOP ha = new HelloAOP();

ha.test();

}


编译HelloAOP.java文件:javac HelloAOP.java

public void test() {

System.out.println("Hello AOP!");

}

}



2)现在我要在输出“Hello AOP!”前后做一些工作,这些工作在运行时会得到调用机会,如果使用AOP术语,我们可以说我们要编写我们的aspect,这个aspect会在运行时被weave into (织入)HelloAOP class。


//MyAspect.java

import org.codehaus.aspectwerkz.joinpoint.JoinPoint;

public class MyAspect {

public void beforeTesting(JoinPoint joinPoint) {

System.out.println("before testing...");

}

 

public void afterTesting(JoinPoint joinPoint) {

System.out.println("after testing...");

}

}
javac MyAspect.java



3)织入过程并不简单,我们需要撰写一个描述文件来将aspect和其织入的class中的信息联系起来。


//aop.xml

<aspectwerkz>

<system id="AspectWerkzExample">

<aspect class="MyAspect">

<pointcut name="testMethod" expression="execution(* HelloAOP.test(..))"/>

<advice name="beforeTesting" type="before" bind-to="testMethod"/>

<advice name="afterTesting" type="after" bind-to="testMethod"/>

</aspect>

</system>

</aspectwerkz>


4)run it


aspectwerkz -Daspectwerkz.definition.file=aop.xml HelloAOP



//output:

before testing...

Hello AOP!

after testing...



Everything is fine!

举报

相关推荐

0 条评论