Java中基于Aspectwerkz的AOP資料_第1頁
Java中基于Aspectwerkz的AOP資料_第2頁
Java中基于Aspectwerkz的AOP資料_第3頁
Java中基于Aspectwerkz的AOP資料_第4頁
Java中基于Aspectwerkz的AOP資料_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Java中基于Aspectwerkz的AOP一、AOP編程概覽面向?qū)ο缶幊碳夹g(shù)進(jìn)入軟件開發(fā)的主流對(duì)軟件的開發(fā)方式產(chǎn)生了極大的影響,開發(fā)者可以用一組實(shí)體以及這些實(shí)體之間的關(guān)系將系統(tǒng)形象地表示出來,這使得他們能夠設(shè)計(jì)出規(guī)模更大、更復(fù)雜的系統(tǒng),開發(fā)周期也比以前更短。OO開發(fā)的唯一問題是,它本質(zhì)上是靜態(tài)的,需求的細(xì)微變化就可能對(duì)開發(fā)進(jìn)度造成重大影響。Aspect-OrientedProgramming(AOP)是對(duì)OO技術(shù)的補(bǔ)充和完善,它允許開發(fā)者動(dòng)態(tài)地修改靜態(tài)的OO模型,構(gòu)造出一個(gè)能夠不斷增長(zhǎng)以滿足新增需求的系統(tǒng),就象現(xiàn)實(shí)世界中的對(duì)象會(huì)在其生命周期中不斷改變自身,應(yīng)用程序也可以在發(fā)展中擁有新的功能。例如,許多人想必有過在開發(fā)簡(jiǎn)單的Web應(yīng)用時(shí)將Servlet作為入口點(diǎn)的經(jīng)驗(yàn),即用Servlet接收HTML表單的輸入,經(jīng)過處理后返回給用戶。開始時(shí)的Servlet可能是非常簡(jiǎn)單的,只有剛好滿足用戶需求的最少量的代碼。然而,隨著“第二需求”的實(shí)現(xiàn),例如實(shí)現(xiàn)異常處理、安全、日志等功能,代碼的體積就會(huì)增加到原來的三、四倍——之所以稱之為“第二需求”,是因?yàn)镾ervlet的基本功能是接受和處理用戶的請(qǐng)求,對(duì)于這個(gè)目標(biāo)來說,日志、安全之類的機(jī)制并不是必不可少的。AOP允許動(dòng)態(tài)地改變OO的靜態(tài)模型,不必修改原來的靜態(tài)模型也可以加入滿足第二需求所需的代碼(實(shí)際上,甚至連原來的源代碼也不需要)。更令人稱奇的是,后來加入的代碼往往可以集中在一個(gè)地方,而不必象單純使用OO時(shí)那樣將后來加入的代碼分散到整個(gè)模型。二、基本術(shù)語在介紹AOP開發(fā)實(shí)例之前,我們先來了解幾個(gè)標(biāo)準(zhǔn)的AOP術(shù)語,以便更好地掌握相關(guān)的概念。Cross-cuttingconcern在OO模型中,雖然大部份的類只有單一的、特定的功能,但它們通常會(huì)與其他類有著共同的第二需求。例如,當(dāng)線程進(jìn)入或離開某個(gè)方法時(shí),我們可能既要在數(shù)據(jù)訪問層的類中記錄日志,又要在UI層的類中記錄日志。雖然每個(gè)類的基本功能極然不同,但用來滿足第二需求的代碼卻基本相同。Advice它是指想要應(yīng)用到現(xiàn)有模型的附加代碼。在本例中,它是指線程進(jìn)入或退出某個(gè)方法時(shí)要運(yùn)行的日志代碼。Point-cut這個(gè)術(shù)語是指應(yīng)用程序中的一個(gè)執(zhí)行點(diǎn),在這個(gè)執(zhí)行點(diǎn)上需要采用前面的cross-cuttingconcern。在本例中,當(dāng)線程進(jìn)入一個(gè)方法時(shí)出現(xiàn)一個(gè)Point-cut,當(dāng)線程離開方法時(shí)又出現(xiàn)另一個(gè)Point-cut。AspectPoint-cut和advice結(jié)合在一起就叫做aspect。在下面的例子中,我們通過定義一個(gè)point-cut并給予適當(dāng)?shù)腶dvice加入了一個(gè)日志(logging)aspect。AOP還有其它許多特性和術(shù)語,例如引入(Introduction),即把接口/方法/域引入到現(xiàn)有的類——它極大地拓寬了開發(fā)者的想象力。不過本文只介紹一些最基本的持性,熟悉這里介紹的概念后,你再深入一步研究AOP的其它特性,看看如何在自己的開發(fā)環(huán)境中使用它們。三、現(xiàn)有的框架目前最成熟、功能最豐富的AOP框架當(dāng)數(shù)AspectJ,AspectJ已成為大多數(shù)其它框架跟從的標(biāo)準(zhǔn)。但是,AspectJ也走出了非同尋常的一步,它的實(shí)現(xiàn)為Java語言增添了新的關(guān)鍵詞。雖然新的語法并不難學(xué),但卻意味著我們必須換一個(gè)編譯器,還要重新配制編輯器,只有這樣才能適應(yīng)新的語法。在規(guī)模較大的開發(fā)組中,這些要求可能難以辦到,因?yàn)檎麄€(gè)開發(fā)小組都會(huì)受到影響。由于語言本身的變化,開發(fā)小組把AOP技術(shù)引入到現(xiàn)有項(xiàng)目的學(xué)習(xí)周期隨之延長(zhǎng)?,F(xiàn)在我們需要的是這樣一個(gè)框架,它可以方便地引入,且不會(huì)對(duì)原來的開發(fā)和構(gòu)造過程產(chǎn)生任何影響。滿足這些要求的框架不止一個(gè),例如JBossAOP、Nanning、Aspectwerkz(AW)。本文選用的是Aspectwerkz,因?yàn)樗赡苁亲钊菀讓W(xué)習(xí)的框架,也是最容易集成到現(xiàn)有項(xiàng)目的框架。Aspectwerkz由JonasBoner和AlexandreVasseur創(chuàng)建,它是目前最快速、功能最豐富的框架之一。雖然它還缺乏AspectJ的某些功能,但己足以滿足大多數(shù)開發(fā)者在許多情形下的需要。Aspectwerkz最令人感興趣的特性之一是它能夠以兩種不同的模式運(yùn)行:聯(lián)機(jī)模式和脫機(jī)模式。在聯(lián)機(jī)模式下,AW直接干預(yù)屬于JVM的底層類裝入機(jī)制,截取所有的類裝入請(qǐng)求,對(duì)字節(jié)碼實(shí)施即時(shí)轉(zhuǎn)換。AW提供了干預(yù)類裝入過程的許多選項(xiàng),另外還有一個(gè)替代bin/java命令的封裝腳本,這個(gè)腳本能夠根據(jù)Java版本和JVM能力自動(dòng)生成一組可運(yùn)行的配制。對(duì)于開發(fā)者,聯(lián)機(jī)模式有許多優(yōu)點(diǎn),它能插入到任何類裝入器并在類裝入期間生成新的類。也就是說,我們不必手工修改應(yīng)用程序的類,只要按通常的方式部署即可。不過,聯(lián)機(jī)模式要求對(duì)應(yīng)用服務(wù)器進(jìn)行額外的配制,有時(shí)這一要求可能很難滿足。在脫機(jī)模式下,生成類需要二個(gè)步驟。第一步是用標(biāo)準(zhǔn)的編譯器編譯,第二步是重點(diǎn)——以脫機(jī)模式運(yùn)行AWcompiler編譯器,讓它處理新生成的類。編譯器將修改這些類的字節(jié)碼,根據(jù)一個(gè)XML文件的定義,在適當(dāng)?shù)膒oint-cut插入advice。脫機(jī)模式的優(yōu)點(diǎn)是AWcompiler生成的類能夠在任何JVM1.3以上的虛擬機(jī)運(yùn)行,本文下面要用的就是這種模式,因?yàn)樗恍枰獙?duì)Tomcat作任何修改,只要對(duì)構(gòu)造過程稍作修改就可以照搬到大多數(shù)現(xiàn)有的項(xiàng)目。四、安裝本文將以一個(gè)簡(jiǎn)單的Web應(yīng)用程序?yàn)槔肁nt編譯,部署在Tomcat4+Servlet容器上。下面我們假定讀者己準(zhǔn)備好上述環(huán)境,包括JVM1.3+,同時(shí)Tomcat被設(shè)置成從webapps文件夾自動(dòng)部署應(yīng)用,自動(dòng)將WAR擴(kuò)展到目錄(這是Tomcat默認(rèn)的操作方式,因此只要你尚未修改Tomcat的運(yùn)行方式,下面的范例可直接運(yùn)行)。我們將把Tomcat的安裝位置稱為%TOMCAT_HOME%。⑴從/下載Aspectwerkz,解開壓縮到適當(dāng)?shù)奈恢?。我們將把這個(gè)位置稱為%ASPECTWERKZ_HOME%。⑵設(shè)置%ASPECTWERKZ_HOME%環(huán)境變量。⑶將Aspectwerkz加入到PATH環(huán)境變量,即設(shè)置setPATH=%PATH%;%ASPECTWERKZ_HOME%inaspectwerkz⑷下載本文的示范程序,將它放入%TOMCAT_HOME%webapps文件夾。⑸將Aspectwerkz的運(yùn)行時(shí)類加入到Tomcat的classpath。你可以將它的JAR文件放入示例應(yīng)用的WEB-INFlib文件夾,或放入%TOMCAT_HOME%commonlib。五、編譯示例應(yīng)用如果你想深入研究一下本文的示例應(yīng)用,可以解開WAR文件提取它的內(nèi)容。你會(huì)發(fā)現(xiàn)根目錄下有一個(gè)aspectwerkz.xml文件,構(gòu)造應(yīng)用時(shí)它會(huì)被復(fù)制到WEB-INF/classes目錄。Servlet和advice的源文件在WEB-INF/src目錄下,另外還有一個(gè)構(gòu)建這些類的ANT腳本。在運(yùn)行這個(gè)示例程序之前,你還要對(duì)它進(jìn)行后期編譯。下面是具體的操作步驟:⑴在命令行窗口中,轉(zhuǎn)到解開WAR文件的目錄。⑵輸入下面的命令調(diào)用AW編譯器:aspectwerkz-offlineaspectwerkz.xmlWEB-INF/classes-cp%TOMCAT_HOME%commonlibservlet.jar。如后期編譯順利通過,應(yīng)看到下面的輸出:(1s)SUCCESS:WEB-INFclasses在構(gòu)建文件中有一個(gè)名稱為war的ANT任務(wù),你可以用它重新創(chuàng)建WAR文件。六、運(yùn)行示例應(yīng)用首先啟動(dòng)(或重新啟動(dòng))Tomcat,然后在瀏覽器中打開localhost:8080/demo/。頁面打開后,可以看到一個(gè)帶二個(gè)輸入框的HTML表單,一個(gè)輸入名字,一個(gè)輸入郵件地址。輸入一些數(shù)據(jù),然后點(diǎn)擊按鈕提交表單,出現(xiàn)一個(gè)頁面顯示出聯(lián)系人信息和一個(gè)指向聯(lián)系人清單的鏈接。七、代碼分析JSP頁面就不分析了,現(xiàn)在我們對(duì)它不感興趣。我們來看看AOPServlet的代碼。packageexample;importjava.io.*;importjavax.servlet.*;importjavax.servlet.http.*;publicclassAOPServletextendsHttpServlet{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletEtion,IOException{Personperson=newPerson();if(request.getParameter("name")!=null){person.setName(request.getParameter("name"));}if(request.getParameter("email")!=null){person.setEmail(request.getParameter("email"));}request.setAttribute("person",person);RequestDispatcherrd=request.getRequestDispatcher("/view.jsp");rd.forward(request,response);}}在這個(gè)例子中,Servlet的代碼己盡量精簡(jiǎn),只包含一些必不可少的代碼,如創(chuàng)建了一個(gè)綁定請(qǐng)求參數(shù)的對(duì)象等,但沒有持久化操作,不需要額外的imports,它只實(shí)現(xiàn)了作為Servlet必須實(shí)現(xiàn)的最基本的操作。然而,根據(jù)說明文檔的要求,這個(gè)應(yīng)用程序必須將所有Person類型的對(duì)象特久化,所以要為這個(gè)應(yīng)用程序加入一個(gè)aspect。為創(chuàng)建這個(gè)aspect,我們首先要?jiǎng)?chuàng)建一個(gè)aspectwerkz.xml文件并將該文件放入classpath指定的目錄。本文示例提供了一個(gè)簡(jiǎn)單的例子,你可以用編輯器打開查看。aspectwerkz.xml的第一部份定義了可用的advice,我們可以根據(jù)需要加入任意數(shù)量的advice:<advice-defname="persist"class="example.PersistenceAdvice"deployment-model="perJVM"/>在這個(gè)片段中,我們定義了一個(gè)名稱為persist的advice,它的類型是example.PersistenceAdvice。最后一個(gè)屬性定義了該advice的排它性,在這里它的值是perJVM,表示在每一個(gè)JVM中只創(chuàng)建該advice的一個(gè)實(shí)例(有關(guān)部署模式的更多說明,請(qǐng)參見Aspectwerkz的文檔。第二部份開始定義aspect,這里就是我們將advice映射到point-cut創(chuàng)建aspect的地方。<aspectname="servlet"><pointcut-defname="all"type="method"pattern="**Servlet.doGet(..)"/><bind-advicepointcut="all"><advice-refname="persist"/></bind-advice></aspect>下面我們一行一行地分析這段代碼:⑴我們創(chuàng)建了一個(gè)叫做servlet的aspect。如有必要,我們可以創(chuàng)建任意數(shù)量的aspect。⑵在第二行,我們創(chuàng)建了一個(gè)叫做all的point-cut,它只適用于方法(type="method")。⑶第三行我們用一個(gè)正則表達(dá)式規(guī)定了把a(bǔ)dvice應(yīng)用到哪里。在這個(gè)例子中,我們指出應(yīng)用advice的條件是:不管返回值的類型是什么(第一個(gè)“*”),名稱以servlet結(jié)尾(*servlet)且包含一個(gè)帶任意參數(shù)的doGet方法(doGet(..))的example包里面的類。⑷在第四行,我們告訴Aspectwerkz編譯器要把后面的advice應(yīng)用到所有的point-cut。⑸在這里我們聲明要使用的advice是persist?,F(xiàn)在我們知道了如何映射point-cut與advice創(chuàng)建出aspect,下面來看看一個(gè)提供advice的類的實(shí)例。在映射文件中,我們注冊(cè)了一個(gè)example.PersistenceAdvice類型的advice,下面是該類型的源代碼:packageexample;importjavax.servlet.http.*;importorg.codehaus.aspectwerkz.advice.*;importorg.codehaus.aspectwerkz.joinpoint.*;publicclassPersistenceAdviceextendsAroundAdvice{publicPersistenceAdvice(){super();}publicObjectexecute(finalJoinPointjoinPoint)throwsThrowable{MethodJoinPointjp=(MethodJoinPoint)joinPoint;finalObjectresult=joinPceed();Object[]parameters=jp.getParameters();if(parameters[0]instanceofHttpServletRequest){HttpServletRequestrequest=(HttpServletRequest)parameters[0];if(request.getAttribute("person")!=null){Personcontact=(Person)request.getAttribute("person");ContactManagerpersistent=newContactManager();StringfileName=(request.getRealPath("/")+"contacts.txt");persistent.save(cont

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論