最愛Java

          書山有路勤為徑,學(xué)海無涯苦作舟

          《AspectJ Cookbook》讀書筆記二: 初始AspectJ

          一. 安裝AspectJ
                  從最簡(jiǎn)單的方面來說,AspectJ安裝很簡(jiǎn)單:
                   1.從http://www.aspectj.org下載最新版本(目前版本是1.6.0)。
                   2.通過雙擊下載下來的JAR來安裝。其默認(rèn)安裝目錄為asprctj1.6目錄。
                   3.可在安裝目錄的bin目錄下調(diào)用ajc命令查看幫助。
                   4.使用AspectJ只需復(fù)制aspectjrt.jar即可。

          二. 第一個(gè)簡(jiǎn)單的方面
                  
          簡(jiǎn)單的業(yè)務(wù)邏輯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的簡(jiǎn)單的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");
              }

          }

          將上述兩個(gè)文件保存在同一目錄中,運(yùn)行ajc命令,編譯這兩個(gè)文件,并產(chǎn)生方面和類的.class文件。
                  ajc -classpath %MY_CLASSPATH% -d %MY_DESTINATION_DIRECTORY% com/oreilly/aspectjcookbook/MyClass.java com/oreilly/aspectjcookbook/HelloWorld.java
          在使用上述命令過程中,需要確保aspectjrt.jar在你的類路徑中。
          ajc編譯器會(huì)將產(chǎn)生兩個(gè).class文件:MyClass.class和HelloWorld.class。并可通過正常的java命令來運(yùn)行:
                  java -classpath %MY_CLASSPATH% com.oreilly.aspectjcookbook.MyClass
          可得到如下結(jié)果:
                  Hello World
                  In the advice attached to the call pointcut  
                  Inside foo(int , String)
          是不是很簡(jiǎn)單呢?現(xiàn)在我們來分析一下方面的每一行的含義:
           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行聲明了一個(gè)方法。
           第4行和第5行聲明單一命名的切入點(diǎn)的邏輯。切入點(diǎn)邏輯指定了應(yīng)用程序中的任何連接點(diǎn),本例中會(huì)捕獲對(duì)void com.oreilly.aspectjcookbook.MyClass.foo(int,String)方法的調(diào)用。切入點(diǎn)被命名為callPointcut(),使得可以在方面的作用域內(nèi)的任意位置都可以引用它。
           第8行到11行聲明單一通知塊。before()通知只是簡(jiǎn)單地指出它將在任何被callPointcut()切入點(diǎn)匹配的連接點(diǎn)之前執(zhí)行。
          注意:除了.java可作為后綴名以外,.aj也可以作為后綴名使用。ajc工具都會(huì)編譯所提供的文件。兩者沒有區(qū)別,只是個(gè)人喜好而已。

          三. 編譯一個(gè)方面和多個(gè)Java文件
              
          如果需要多個(gè)文件,那么按上述方法編譯是一件痛苦的事情。好在我們可以編寫一個(gè)AspectJ配置構(gòu)建文件。配置構(gòu)建文件的后綴名為.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%

          四. 織入方面到j(luò)ar中
              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選項(xiàng)強(qiáng)制ajc編譯器從提供的.jar文件中把Java字節(jié)碼提取到-d選項(xiàng)所指定的目錄中。然后,ajc編譯器將把字節(jié)碼在方面織入過程中。
              3. 上述命令并不會(huì)產(chǎn)生新的.jar包,如需要將方面織入到新的包中,則需要使用-ourjar選項(xiàng):
                  ajc -classpath %MY_CLASSPATH% -d %MY_DESTINATION_DIRECTORY% -inpath MyApp.jar -outjar MyAspectOriente的App.jar com/oreilly/aspectjcookbook/HelloWorld.java

          五.其他
            aj命令可以加載時(shí)織入方面
            ajdoc則可生成Javadoc文檔

          六. 使用Ant構(gòu)建一個(gè)AspectJ項(xiàng)目

          <?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任務(wù)屬性定義了一個(gè)新的任務(wù)
                2. 指定aspectjtools.jar的位置
                3. 聲明一個(gè)構(gòu)建目標(biāo),他使用iajc任務(wù)來編譯項(xiàng)目,這個(gè)任務(wù)反過來又依賴于aspectjrt.jarlai

          posted on 2008-06-30 23:10 Brian 閱讀(854) 評(píng)論(0)  編輯  收藏 所屬分類: 《AspectJ Cookbook》讀書筆記

          公告


          導(dǎo)航

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

          統(tǒng)計(jì)

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 清远市| 扶绥县| 云林县| 靖边县| 石城县| 彭州市| 英吉沙县| 双峰县| 荔浦县| 庄河市| 永川市| 禹州市| 峨山| 保亭| 达州市| 寿阳县| 绵阳市| 林芝县| 泰兴市| 贵阳市| 建平县| 孟村| 赣州市| 新昌县| 施甸县| 朔州市| 海丰县| 平陆县| 穆棱市| 湘潭市| 克拉玛依市| 赤城县| 文成县| 红安县| 泾川县| 剑阁县| 太康县| 肇东市| 敖汉旗| 望城县| 定陶县|