最爱Java

书山有路勤为径,学海无涯苦作舟

《AspectJ Cookbook》读书笔记二: 初始AspectJ

一. 安装AspectJ
        从最简单的方面来说,AspectJ安装很简单:
         1.从http://www.aspectj.org下载最新版本(目前版本是1.6.0)。
         2.通过双击下载下来的JAR来安装。其默认安装目录为asprctj1.6目录。
         3.可在安装目录的bin目录下调用ajc命令查看帮助。
         4.使用AspectJ只需复制aspectjrt.jar即可。

二. 第一个简单的方面
        
简单的业务逻辑Java类
package com.oreilly.aspectjcookbook;

public class MyClass {
    
public void foo(int number , String name) {
        System.out.println(
"Inside foo(int , String)");
    }

    
    
public static void main(String[] args) {
        
//Create an instance of MyClass
        MyClass myObject = new MyClass();
        
//Make the call to foo
        myObject.foo(1 , "Russ Miles");
    }

}

        AspectJ的简单的HelloWorld方面
package com.oreilly.aspectjcookbook;

public aspect HelloWorld {
    pointcut callPointcut() :
        call(
void com.oreilly.aspectjcookbook.MyClass.foo(int,String));
    
    
    before() : callPointcut() 
{
        System.out.println(
"Hello World");
        System.out.println(
"In the advice attached to the call pointcut");
    }

}

将上述两个文件保存在同一目录中,运行ajc命令,编译这两个文件,并产生方面和类的.class文件。
        ajc -classpath %MY_CLASSPATH% -d %MY_DESTINATION_DIRECTORY% com/oreilly/aspectjcookbook/MyClass.java com/oreilly/aspectjcookbook/HelloWorld.java
在使用上述命令过程中,需要确保aspectjrt.jar在你的类路径中。
ajc编译器会将产生两个.class文件:MyClass.class和HelloWorld.class。并可通过正常的java命令来运行:
        java -classpath %MY_CLASSPATH% com.oreilly.aspectjcookbook.MyClass
可得到如下结果:
        Hello World
        In the advice attached to the call pointcut  
        Inside foo(int , String)
是不是很简单呢?现在我们来分析一下方面的每一行的含义:
 1package com.oreilly.aspectjcookbook;
 2
 3public aspect HelloWorld {
 4    pointcut callPointcut() :
 5        call(void com.oreilly.aspectjcookbook.MyClass.foo(int,String));
 6    
 7    
 8    before() : callPointcut() {
 9        System.out.println("Hello World");
10        System.out.println("In the advice attached to the call pointcut");
11    }

12}


 第3行声明了一个方法。
 第4行和第5行声明单一命名的切入点的逻辑。切入点逻辑指定了应用程序中的任何连接点,本例中会捕获对void com.oreilly.aspectjcookbook.MyClass.foo(int,String)方法的调用。切入点被命名为callPointcut(),使得可以在方面的作用域内的任意位置都可以引用它。
 第8行到11行声明单一通知块。before()通知只是简单地指出它将在任何被callPointcut()切入点匹配的连接点之前执行。
注意:除了.java可作为后缀名以外,.aj也可以作为后缀名使用。ajc工具都会编译所提供的文件。两者没有区别,只是个人喜好而已。

三. 编译一个方面和多个Java文件
    
如果需要多个文件,那么按上述方法编译是一件痛苦的事情。好在我们可以编写一个AspectJ配置构建文件。配置构建文件的后缀名为.lst,其中包含了所有在编译中需要使用的类文件和方面的名称。如:
        //File in file.lst
        com/oreilly/aspectjcookbook/MyClass.java
        com/oreilly/aspectjcookbook/MyAspect.java
        com/oreilly/aspectjcookbook/AnotherClass.java
        com/oreilly/aspectjcookbook/AnotherAspect.java
然后使用如下命令编译:
        ajc -argfile file.lst -classpath %MY_CLASSPATH% -d %MY_DESTINATION_DIRECTORY%

四. 织入方面到jar中
    1.首先编译MyClass.java并打包到MyApp.jar中
        java -classpath %MY_CLASSPATH% -d %MY_DESTINATION_DIRECTORY% com/oreilly/aspectjcookbook/MyClass.java
        jar -cvf MyApp.jar com/oreilly/aspectjcookbook/MyClass.class
    2.ajc -classpath %MY_CLASSPATH% -d %MY_DESTINATION_DIRECTORY% -inpath MyApp.jar com/oreilly/aspectjcookbook/HelloWorld.java
        -inpath选项强制ajc编译器从提供的.jar文件中把Java字节码提取到-d选项所指定的目录中。然后,ajc编译器将把字节码在方面织入过程中。
    3. 上述命令并不会产生新的.jar包,如需要将方面织入到新的包中,则需要使用-ourjar选项:
        ajc -classpath %MY_CLASSPATH% -d %MY_DESTINATION_DIRECTORY% -inpath MyApp.jar -outjar MyAspectOriente的App.jar com/oreilly/aspectjcookbook/HelloWorld.java

五.其他
  aj命令可以加载时织入方面
  ajdoc则可生成Javadoc文档

六. 使用Ant构建一个AspectJ项目

<?xml version="1.0" encoding="utf-8"?>
<project basedir="." default="compile" name="test">
    
<property name="src" value="src"/>
    
<property name="build" value="build"/>
    
<taskdef resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties">
        
<classpath>
            
<pathelement location="%ASPECTJ_INSTALLATION%/lib/aspectjtools.jar"/>
        
</classpath>
    
</taskdef>
    
<target name="compile">
        
<mkdir dir="${build}"/>
        
<iajc destdir="${build}" sourceroots="${src}">
            
<classpath>
                
<pathelement location="%ASPECTJ_INSTALLATION%/lib/aspectjrt.jar"/>
            
</classpath>
        
</iajc>
    
</target>
</project>

    上述代码所做的工作:
      1. 使用AspectJ任务属性定义了一个新的任务
      2. 指定aspectjtools.jar的位置
      3. 声明一个构建目标,他使用iajc任务来编译项目,这个任务反过来又依赖于aspectjrt.jarlai

posted on 2008-06-30 23:10 Brian 阅读(840) 评论(0)  编辑  收藏 所属分类: 《AspectJ Cookbook》读书笔记


只有注册用户登录后才能发表评论。


网站导航:
 

公告


导航

<2008年6月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

统计

常用链接

留言簿(4)

随笔分类

随笔档案

收藏夹

搜索

最新评论

阅读排行榜

评论排行榜