最愛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 閱讀(854) 評論(0)  編輯  收藏 所屬分類: 《AspectJ Cookbook》讀書筆記

          公告


          導航

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

          統計

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 涞水县| 望都县| 邵阳县| 洪湖市| 休宁县| 连平县| 石楼县| 灌阳县| 海南省| 波密县| 西丰县| 永寿县| 博客| 景谷| 神木县| 麻阳| 韶山市| 登封市| 白玉县| 集贤县| 景泰县| 丰宁| 黑河市| 博湖县| 公安县| 天水市| 同江市| 西畴县| 阿巴嘎旗| 永福县| 靖边县| 张家川| 中阳县| 阳春市| 东方市| 三门县| 平舆县| 兴安县| 卫辉市| 金坛市| 九寨沟县|