熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java中實現基於Aspectwerkz的AOP開發

2013-11-23 19:17:19  來源: Java核心技術 

  AOP編程概覽
  面向對象編程技術進入軟件開發的主流對軟件的開發方式產生了極大的影響開發者可以用一組實體以及這些實體之間的關系將系統形象地表示出來這使得他們能夠設計出規模更大更復雜的系統開發周期也比以前更短OO開發的唯一問題是它本質上是靜態的需求的細微變化就可能對開發進度造成重大影響
  
  AspectOriented Programming(AOP)是對OO技術的補充和完善它允許開發者動態地修改靜態的OO模型構造出一個能夠不斷增長以滿足新增需求的系統就象現實世界中的對象會在其生命周期中不斷改變自身應用程序也可以在發展中擁有新的功能
  
  例如許多人想必有過在開發簡單的Web應用時將Servlet作為入口點的經驗即用Servlet接收HTML表單的輸入經過處理後返回給用戶開始時的Servlet可能是非常簡單的只有剛好滿足用戶需求的最少量的代碼然而隨著第二需求的實現例如實現異常處理安全日志等功能代碼的體積就會增加到原來的三四倍——之所以稱之為第二需求是因為Servlet的基本功能是接受和處理用戶的請求對於這個目標來說日志安全之類的機制並不是必不可少的
  
  AOP允許動態地改變OO的靜態模型不必修改原來的靜態模型也可以加入滿足第二需求所需的代碼(實際上甚至連原來的源代碼也不需要)更令人稱奇的是後來加入的代碼往往可以集中在一個地方而不必象單純使用OO時那樣將後來加入的代碼分散到整個模型
  
  基本術語
  在介紹AOP開發實例之前我們先來了解幾個標准的AOP術語以便更好地掌握相關的概念
  
  █ Crosscutting concern
  
  在OO模型中雖然大部份的類只有單一的特定的功能但它們通常會與其他類有著共同的第二需求例如當線程進入或離開某個方法時我們可能既要在數據訪問層的類中記錄日志又要在UI層的類中記錄日志雖然每個類的基本功能極然不同但用來滿足第二需求的代碼卻基本相同
  
  █ Advice
  
  它是指想要應用到現有模型的附加代碼在本例中它是指線程進入或退出某個方法時要運行的日志代碼
  
  █ Pointcut
  
  這個術語是指應用程序中的一個執行點在這個執行點上需要采用前面的crosscutting concern在本例中當線程進入一個方法時出現一個Pointcut當線程離開方法時又出現另一個Pointcut
  
  █ Aspect
  
  Pointcut和advice結合在一起就叫做aspect在下面的例子中我們通過定義一個pointcut並給予適當的advice加入了一個日志(logging)aspect
  
  AOP還有其它許多特性和術語例如引入(Introduction)即把接口/方法/域引入到現有的類——它極大地拓寬了開發者的想象力不過本文只介紹一些最基本的持性熟悉這裡介紹的概念後你再深入一步研究AOP的其它特性看看如何在自己的開發環境中使用它們
  
  現有的框架
  目前最成熟功能最豐富的AOP框架當數AspectJAspectJ已成為大多數其它框架跟從的標准但是AspectJ也走出了非同尋常的一步它的實現為Java語言增添了新的關鍵詞雖然新的語法並不難學但卻意味著我們必須換一個編譯器還要重新配制編輯器只有這樣才能適應新的語法在規模較大的開發組中這些要求可能難以辦到因為整個開發小組都會受到影響由於語言本身的變化開發小組把AOP技術引入到現有項目的學習周期隨之延長
  
  現在我們需要的是這樣一個框架它可以方便地引入且不會對原來的開發和構造過程產生任何影響滿足這些要求的框架不止一個例如JBoss AOPNanningAspectwerkz(AW)本文選用的是Aspectwerkz因為它可能是最容易學習的框架也是最容易集成到現有項目的框架
  
  Aspectwerkz由Jonas Boner和Alexandre Vasseur創建它是目前最快速功能最豐富的框架之一雖然它還缺乏AspectJ的某些功能但己足以滿足大多數開發者在許多情形下的需要
  
  Aspectwerkz最令人感興趣的特性之一是它能夠以兩種不同的模式運行聯機模式和脫機模式在聯機模式下AW直接干預屬於JVM的底層類裝入機制截取所有的類裝入請求對字節碼實施即時轉換AW提供了干預類裝入過程的許多選項另外還有一個替代bin/java命令的封裝腳本這個腳本能夠根據Java版本和JVM能力自動生成一組可運行的配制對於開發者聯機模式有許多優點它能插入到任何類裝入器並在類裝入期間生成新的類也就是說我們不必手工修改應用程序的類只要按通常的方式部署即可不過聯機模式要求對應用服務器進行額外的配制有時這一要求可能很難滿足
  
  在脫機模式下生成類需要二個步驟第一步是用標准的編譯器編譯第二步是重點——以脫機模式運行AWcompiler編譯器讓它處理新生成的類編譯器將修改這些類的字節碼根據一個XML文件的定義在適當的pointcut插入advice脫機模式的優點是AWcompiler生成的類能夠在任何JVM 以上的虛擬機運行本文下面要用的就是這種模式因為它不需要對Tomcat作任何修改只要對構造過程稍作修改就可以照搬到大多數現有的項目
  
  安裝
  本文將以一個簡單的Web應用程序為例它用Ant編譯部署在Tomcat + Servlet容器上下面我們假定讀者己准備好上述環境包括JVM +同時Tomcat被設置成從webapps文件夾自動部署應用自動將WAR擴展到目錄(這是Tomcat默認的操作方式因此只要你尚未修改Tomcat的運行方式下面的范例可直接運行)我們將把Tomcat的安裝位置稱為%TOMCAT_HOME%
  
  ⑴ 從下載Aspectwerkz解開壓縮到適當的位置我們將把這個位置稱為%ASPECTWERKZ_HOME%
  
  ⑵ 設置%ASPECTWERKZ_HOME%環境變量
  
  ⑶ 將Aspectwerkz加入到PATH環境變量即設置set PATH=%PATH%;%ASPECTWERKZ_HOME%\bin\aspectwerkz
  
  ⑷ 下載本文的示范程序將它放入%TOMCAT_HOME%\webapps文件夾
  
  ⑸ 將Aspectwerkz的運行時類加入到Tomcat的classpath你可以將它的JAR文件放入示例應用的WEBINF\lib文件夾或放入%TOMCAT_HOME%\common\lib
  
  編譯示例應用
  如果你想深入研究一下本文的示例應用可以解開WAR文件提取它的內容你會發現根目錄下有一個aspectwerkzxml文件構造應用時它會被復制到WEBINF/classes目錄Servlet和advice的源文件在WEBINF/src目錄下另外還有一個構建這些類的ANT腳本
  
  在運行這個示例程序之前你還要對它進行後期編譯下面是具體的操作步驟
  
  ⑴ 在命令行窗口中轉到解開WAR文件的目錄
  
  ⑵ 輸入下面的命令調用AW編譯器:aspectwerkz offline aspectwerkzxml WEBINF/classes cp %TOMCAT_HOME%\common\lib\servletjar如後期編譯順利通過應看到下面的輸出
  
  ( s )
  SUCCESS: WEBINF\classes
  
  在構建文件中有一個名稱為war的ANT任務你可以用它重新創建WAR文件
  
  運行示例應用
  首先啟動(或重新啟動)Tomcat然後在浏覽器中打//localhost:/demo/
  
  頁面打開後可以看到一個帶二個輸入框的HTML表單一個輸入名字一個輸入郵件地址輸入一些數據然後點擊按鈕提交表單出現一個頁面顯示出聯系人信息和一個指向聯系人清單的鏈接
  
  代碼分析
  JSP頁面就不分析了現在我們對它不感興趣我們來看看AOPServlet的代碼
  package example;
  
  import javaio*;
  import javaxservlet*;
  import javaxservlethttp*;
  public class AOPServlet extends HttpServlet {
   public void doGet(HttpServletRequest request HttpServletResponse response)
   throws ServletException IOException {
    Person person = new Person();
    if (requestgetParameter(name) != null) {
     personsetName(
     requestgetParameter(name));
    }
    if (requestgetParameter(email) != null) {
     personsetEmail(
     requestgetParameter(email));
    }
    requestsetAttribute(person person);
    RequestDispatcher rd =requestgetRequestDispatcher(/viewjsp);
    rdforward(request response);
   }
  }
  
  在這個例子中Servlet的代碼己盡量精簡只包含一些必不可少的代碼如創建了一個綁定請求參數的對象等但沒有持久化操作不需要額外的imports它只實現了作為Servlet必須實現的最基本的操作
  
  然而根據說明文檔的要求這個應用程序必須將所有Person類型的對象特久化所以要為這個應用程序加入一個aspect為創建這個aspect我們首先要創建一個aspectwerkzxml文件並將該文件放入classpath指定的目錄本文示例提供了一個簡單的例子你可以用編輯器打開查看
  
  aspectwerkzxml的第一部份定義了可用的advice我們可以根據需要加入任意數量的advice
  
  <advicedef name=persist class=examplePersistenceAdvice deploymentmodel=perJVM/>
  
  在這個片段中我們定義了一個名稱為persist的advice它的類型是examplePersistenceAdvice最後一個屬性定義了該advice的排它性在這裡它的值是perJVM
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26585.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.