论坛上有人评价Java在过去的2004有两大值得称赞的技术发展,一个是Java在IOC模式上的成熟应用,再就是Java的AOP框架。

一、好消息
2005年一月份传来好消息,AspectJAspectWerkz合力打造AOP框架,两个开发团队将合力开发一个全新的面向方面编程(Aspect-Oriented Programming,AOP)平台,在其中融合双方的长处和经验。这两家都是业界重要的开源AOP实现,不过走了不同的技术路线:AspectJ一直坚持“预编译+源码生成”,AspectWerkz则是“元数据+运行时织入”的代表。关于两种技术路线、两种产品的争论一直是AOP社群的热点话题,如今两个开源组织决定彻底解决这个困扰。两家合并之后的第一个产品将是AspectJ 5,其中既有AspectJ风格的、基于语言扩展的AOP,也有AspectWerkz风格的、基于XML(和JSR-175 annotation)的AOP。随后,双方还会继续融合各自的长处和经验,努力提供一个完善而统一的AOP平台。

下载了AspectJ和AspectWerkz,并分别看了一下各自的FAQ,得到2点结论:
- 现在的AOP技术走势是动态织入;
- AspectWerkz没有添加新的语法之类的东西,它使用的是标准的Java语法,上手简单,而AspectJ则构建一套自己的特殊语法,上手不易。

所以在对AOP进行感性认识的阶段,我更倾向于使用AspectWerkz。

二、Hello AOP!
其实每个人在学习一门新的语言或技术的时候,都会经历一个“成就感驱动的”的学习过程。拿C为例,几乎每个初学者都会在几乎不懂任何C语法的情况下,照猫画虎地写出一个“Hello World”程序来。Why? Because he/she needs this feeling!如果连这样的一个小小的程序都运行不起来或者说出现满屏的错误,初学者的心理就会受到很大影响,也可能这个学习过程会就此结束。OK!作为一个AOP的初学者,我们也来个“Hello AOP”,使用AspectWerkz。

上面已经提到,AspectWerkz使用标准Java语法,只要你学过Java,you have got the passport of the first gate to AOP。

* 搭建AOP环境
 - 下载AspectWerkz包(http://aspectwerkz.codehaus.org/index-aw.html )后解压到一个目录(假设为D:\aw_2_0_2),然后设置环境变量ASPECTWERKZ_HOME=D:\ aw_2_0_2。
 - 设置PATH环境变量
PATH=%ASPECTWERKZ_HOME%\bin
 - 设置CLASSPATH环境变量
CLASSPATH=%ASPECTWERKZ_HOME%\lib\aspectwerkz-2.0.RC2.jar;%ASPECTWERKZ_HOME%\lib\aspectwerkz-jdk14-2.0.RC2.jar;%ASPECTWERKZ_HOME%\lib\dom4j-1.4.jar;%ASPECTWERKZ_HOME%\lib\qdox-1.4.jar;%ASPECTWERKZ_HOME%\lib\concurrent-1.3.1.jar;%ASPECTWERKZ_HOME%\lib\trove-1.0.2.jar;%ASPECTWERKZ_HOME%\lib\jrexx-1.1.1.jar;%CLASSPATH%

* 开始AOP
1)这里我们要在屏幕打印出“Hello AOP!”,看如下代码:
//HelloAOP.java
public class HelloAOP {
    public static void main(String args[]) {
        HelloAOP ha = new HelloAOP();
        ha.test();
    }
    public void test() {
        System.out.println("Hello AOP!");
    }
}
编译HelloAOP.java文件:javac HelloAOP.java

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

   
       
               
               
               
       
   

4)run it
aspectwerkz -Daspectwerkz.definition.file=aop.xml HelloAOP

//output:
before testing…
Hello AOP!
after testing…

Everything is Perfect!

© 2005, bigwhite. 版权所有.

Related posts:

  1. Effective Java阅读笔记-item12
  2. Effective Java阅读笔记-item1
  3. Effective Java阅读笔记-item24、25、34
  4. 如何编写类中的setter和getter
  5. Effective Java阅读笔记-item16