本文從一個現有的Tapestry web應用程序開始。這個應用程序實現兩個單獨的關注點:日志記錄和性能剖析。每個項目都有這些需求,許多項目用Log4J做日志記錄而用Atlassian剖析器框架做性能分析。然后最初的非AOP實現被重構,以便使用AspectWerkz框架來分離每個關注點的實現。產生的應用程序代碼將會更簡單,更輕易維護,而最重要的是,更自然,表達能力更強。
本文中描述的所有應用程序和源代碼都可以下載得到。
簡介
為了證實AOP的強大,我們從一個非AOP Web應用程序開始,并重構它以使用AOP。應用程序的前后映像將說明AOP是多么易于使用,及方面作為java語言的擴展是多么有用。
示例程序實現了一個示例blog,以答應用戶在已有文章上張貼新的文章和評論。它是由多種框架實現的,包括用于web層的Tapestry,作為O/R Mapping解決方案的Hibernate,以及把各部分結合起來的Sping框架。日志記錄是用Log4J框架實現的,而性能是用Atlassian剖析器來監控的。
出于演示目的,blog應用程序保持盡可能地簡單。盡管很簡單,blog應用程序包含了使它像一個“真正的”應用程序的足夠功能,因此文中的代碼可以應用于現有的企業項目。
本文假定讀者對AOP概念有基本的理解。AOP的初學者應該閱讀下面引用的文章和教程。所有的例子都將用運行在BEA WebLogic JRockit 1.4.2 SDK上的AspectWerk 2.0實現。另外一些可選的環境請參見AspectWerk主站點。
運行示例程序
要運行示例應用程序,需要一個數據庫和一個servlet容器。本文假定使用MySQL。
安裝完必需的軟件后,下載并解壓示例代碼到一個臨時目錄中。該發行版中有三個文件:
首先,設置MySQL來得到所需的數據庫。把數據庫命名為“blog”,并設置一個口令為“passWord”的用戶id“blog”。然后通過執行blog-ddl.sql腳本來定義模式(在MySQL提示符下鍵入sourceblog-ddl.sql)。
現在我們可以部署應用程序了。Blog應用程序的兩個版本都被打包成WAR文件,所以可以直接了當地部署到servlet容器中。
現在可以通過訪問網址http://localhost:7001/blog-preaop/blog和http://localhost:7001/blog-postaop/blog來運行應用程序了。試著運行應用程序的一些功能并檢查WEB-INF/classes目錄中的源代碼。本文的其余部分將具體分析兩種實現并著重說明AOP方法的優點。
分析最初的blog應用程序
blog應用程序實現了兩個橫切關注點:日志記錄和性能剖析。這些關注點要在貫穿整個應用程序的所有類中實現。讓我們看看,利用AOP出現以前可用的標準Java工具是如何實現這兩個關注點的。
日志記錄
日志記錄的目的是能夠在不打開調試器的情況下調試生產應用程序。在我的項目中已經證實很有價值的有,通過記錄每個方法的入口和出口來跟蹤代碼。例如,在HibernateEntryDao類中,下面的代碼是用來查找所有blog入口的:private static final Log log = Log.getLog(EntryHibernateDao.class); public Entry[] findAll() { log.enter("findAll"); List entries = getHibernateTemplate().find("from Entry"); log.exit("findAll"); return (Entry[])entries.toArray(new Entry[] {}); }
當用于整個代碼時,將對完全的用戶請求產生下面的日志輸出:
com.tss.blog.web.applicationServlet INFO : >service: ’/blog’ com.tss.blog.service.BlogSvcImpl INFO : >findAllEntries com.tss.blog.persistence.EntryHibernateDao INFO : >findAll com.tss.blog.persistence.EntryHibernateDao INFO : <findAll com.tss.blog.service.BlogSvcImpl INFO : <findAllEntries com.tss.blog.web.ApplicationServlet INFO : <service:’/blog’
新聞熱點
疑難解答