Open Java Project

          Keep it simple, Stupid, Less is more

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            20 Posts :: 0 Stories :: 12 Comments :: 0 Trackbacks

          1、開發環境

          l         Eclipse 3.0.1

          l         AspectWerkz2.0 RC2http://aspectwerkz.codehaus.org/releases.html

          l         AspectWerkz Eclipse plugin 2.0.4http://aspectwerkz.codehaus.org/downloads/eclipse

           

          2、對工程使能AspectWerkz

          l         創建普通的Java工程:AWHello

          l         右擊工程名,選擇Enable AspectWerkz AOP使能AspectWerkz

          l         Error Log視圖中可以查看插件產生的跟蹤信息

           

          3、添加依賴的JAR

          目前的插件不會自動添加依賴的AspectWerkz JAR文件到工程中,需要手工添加,這些JAR文件包括(可以在AspectWerkz2.0 RC2lib目錄下找到):

          l         aspectwerkz-2.0.RC2.jar

          l         aspectwerkz-core-2.0.RC2.jar

          l         aspectwerkz-jdk14-2.0.RC2.jarJDK1.4)或aspectwerkz-jdk5-2.0.RC2.jarJDK1.5

          l         concurrent-1.3.1.jar

          l         dom4j-1.4.jar

          l         jarjar-0.3.jar

          l         jrexx-1.1.1.jar

          l         piccolo-1.03.jar

          l         qdox-1.4.jar

          l         trove-1.0.2.jar


           

          4、創建測試程序

          package foo;
           
          public class HelloWorld {
           
              public static void main(String args[]) {
                  HelloWorld world = new HelloWorld();
                  world.greet();
              }
           
              public void greet() {
                  System.out.println("Hello World!");
              }
          }

           

          5、編寫Aspect

          package foo;
           
          import org.codehaus.aspectwerkz.joinpoint.JoinPoint;
           
          public class MyAspect {
           
              public void beforeGreeting(JoinPoint joinPoint) {
                  System.out.println("before greeting...");
              }
           
              public void afterGreeting(JoinPoint joinPoint) {
                  System.out.println("after greeting...");
              }
          }

          l         MyAspect類包含了用來編織到HelloWorld類中的代碼

          l         注意:Aspect方法必須包含JoinPoint參數

           

          6AOP編織(weaving

          l         使用META-INF/aop.xml來定義Aspect(通常位于工程的/src目錄下)

          <!DOCTYPE aspectwerkz PUBLIC "-//AspectWerkz//DTD//EN" "http://aspectwerkz.codehaus.org/dtd/aspectwerkz2.dtd">
          <aspectwerkz>
              <system id="AWHello">
                  <package name="foo">
                          <aspect class="MyAspect">
                                 <pointcut name="greetMethod" 
                                   expression="execution(* foo.HelloWorld.greet(..))"/>
                                 <advice name="beforeGreeting" type="before" 
                                   bind-to="greetMethod"/>
                                 <advice name="afterGreeting" type="after" 
                                   bind-to="greetMethod"/>
                          </aspect>
                  </package>
              </system>
          </aspectwerkz>

          l         <package>標記:指定Aspect類所在的包路徑

          l         <aspect>標記:指定Aspect

          l         <pointcut>標記:指定在哪里插入Aspect方法(Pointcut

          ?         該方法只是用來綁定后面<advice>標記指定的 Advice

          ?         expression屬性:必須是符合Join point選擇模式語言的有效表達式,并且要確保全路徑的類名包含到模式中

          l         <advice>標記:指定要插入的Aspect方法(Advice

          ?         name屬性:指定Aspect類中對應的方法名

          ?         type屬性:指定Advice類型,可以是beforeafteraround

          ?         bind-to屬性:指定綁定的Pointcut

          l         這個例子是在HelloWorld.greet()方法調用之前插入MyAspect.beforeGreeting()方法;在HelloWorld.greet()方法返回之后插入MyAspect.afterGreeting()方法

          l         在保存文件時,觸發Eclipse Build時,同樣會觸發基于有效META-INF/aop.xml文件或在Aspect中定義、被編譯的Annotation(后面講述)的AOP編織

           

          7AOP交叉視圖支持

          l         AOP編織發生后,會在Advice應用的地方使用右指向標記來標記

          l         點擊該標記,顯示Quick fix提示,包括該Join point處應用的Advice及其類型

          l         點擊具體Advice,會定位到該Advice的源代碼處

          l         對于當前插件,修改Aspect類不會更新標記處的信息

          l         可以通過修改目標文件或手工執行clean build來實現更新



           

          8、運行程序

          l         首先要在工程build path中添加依賴的tools.jarJAVA_HOME/lib/tools.jar

          l         選擇Run > Run...

          l         在左邊列表中選擇AspectWerkz Application,點擊New按鈕

          l         后面就按正規應用程序的方法運行

          l         本例的運行結果是:

          before greeting...
          Hello World!
          after greeting...

           

          9Annotations支持

          l         Annotations提供了一種在Aspect類中添加元數據的方法,而不是在分離的文件(aop.xml)中指定

          l         本插件包含了AspectWerkz Java 1.4 Annotation編譯器,

          l         Aspect類源代碼編譯時,Annotations也會被編譯

          l         可以在Aspect類中使用JavaDoc風格的注釋定義AnnotationsJDK 1.4),下面是一個使用AnnotationsAspect類:

          package foo;
           
          import org.codehaus.aspectwerkz.joinpoint.StaticJoinPoint;
           
          public class MyAspectWithAnnotations {
           
                    /**
                     * @Before execution(* foo.HelloWorld.greet(..))
                     */
                     public void beforeGreeting(StaticJoinPoint joinPoint) {
                         System.out.println("before greeting with annotation...");
                     }
           
                    /**
                     * @After execution(* foo.HelloWorld.greet(..))
                     */
                     public void afterGreeting(StaticJoinPoint joinPoint) {
                         System.out.println("after greeting with annotation...");
                     }
          }

          l         對于AspectWerkz 2.x版本,這里可以使用StaticJoinPoint來替代JoinPoint,以優化性能

          l         使用Annotations意味著不需要在aop.xml中描述Aspect的細節,但是仍然需要指定Aspect類:

          <!DOCTYPE aspectwerkz PUBLIC "-//AspectWerkz//DTD//EN" "http://aspectwerkz.codehaus.org/dtd/aspectwerkz2.dtd">
          <aspectwerkz>
              <system id="AWHello">
                  <package name="foo">
                          <aspect class="MyAspect">
                                 <pointcut name="greetMethod" 
                                   expression="execution(* foo.HelloWorld.greet(..))"/>
                                 <advice name="beforeGreeting" type="before" 
                                   bind-to="greetMethod"/>
                                 <advice name="afterGreeting" type="after" 
                                   bind-to="greetMethod"/>
                          </aspect>
                  </package>
                  <aspect class="foo.MyAspectWithAnnotations"/>
              </system>
          </aspectwerkz>

          l         重新運行的結果如下:

          before greeting with annotation...
          before greeting...
          Hello World!
          after greeting...
          after greeting with annotation...

           

          posted on 2005-03-21 22:37 nelson_tu 閱讀(1344) 評論(0)  編輯  收藏 所屬分類: AOP

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 惠来县| 襄城县| 铜梁县| 五华县| 乌兰察布市| 凌云县| 那曲县| 邛崃市| 横峰县| 关岭| 大邑县| 平舆县| 内江市| 舒城县| 启东市| 靖江市| 花莲市| 临颍县| 星座| 沙洋县| 永昌县| 福清市| 罗平县| 临猗县| 应城市| 大理市| 汾西县| 淮滨县| 龙川县| 黑水县| 连南| 静乐县| 高雄县| 土默特左旗| 昆明市| 道孚县| 博爱县| 遂昌县| 霍城县| 余庆县| 灵宝市|