唐念剛,張 勇
(1.武漢郵電科學研究院 湖北 武漢 430070;2.武漢長江通信智聯技術有限公司 湖北 武漢430070)
AOP技術在Web系統日志和事物管理中的應用
唐念剛1,張 勇2
(1.武漢郵電科學研究院 湖北 武漢 430070;2.武漢長江通信智聯技術有限公司 湖北 武漢430070)
一個完整的軟件項目系統分為核心業務關注點與系統級的方面關注點,利用AOP技術可以在Web系統中將項目中的業務邏輯與系統級邏輯進行分離,達到松耦合的目的。文章首先介紹AOP技術的概念與原理,然后結合一個系統實例介紹兩種AOP技術分別在日志和事物管理中應用,并證明其可行性。
Web系統;AOP技術;日志管理;事物管理
當前,Web項目系統日趨復雜與龐大,應用也越來越廣泛,為目前最重要的基于文檔的分布式系統。
日志管理功能模塊在系統開發與應用中起著重要作用,系統日志管理可以記錄下系統進行的一系列行為信息,包括開發人員在開發過程中調試異常操作的信息數據,用戶在系統操作過程中記錄下的信息,提高了開發人員的開發效率,也提升了系統的安全性以及可操作性。事務管理模塊的作用是對系統數據庫操作進行統一的提交或回滾,以便服務器保持數據的完整性,事務管理模塊對于大型應用系統,尤其是并發性強的實時系統極為重要,保證系統能夠正確順利的運行。
傳統的日志與事務管理模塊的設計中代碼重復與代碼散亂給開發與維護帶來了較大的困難。以關注點分離為核心思想的面向切面編程技術(AOP)能很好的解決上述問題,利用AOP技術可以在Web系統中將項目中的業務邏輯與系統級邏輯進行分離,減少重復代碼,達到松耦合的目的[1]。
AOP(Aspect Oriented Programming)即面向切面編程,可以將一些系統相關的工程,獨立提取出來,然后通過切面切入到系統,從而避免了在業務邏輯的代碼中混入過多的系統相關的代碼,比如事務管理、日志處理記錄等等,實現了系統松耦合的特點。AOP的幾個關鍵術語分別為:
1)連接點(Joint Point)是程序執行過程中可以切入的點,它可以是對一個函數的調用或者是對象的一個屬性。
2)切入點(PointCut)符合切點表達式的連接點,也就是真正切入的地方。
3)通知(Advice)切面在某個連接點執行的操作,它可以分為前置通知(Before Advice)、后置通知(After Advice)、環繞通知(Around Advice)及異常通知(Throwing Advice)等,分別表示在調用或執行方法的不同位置處切入。
4)Aspect(切面)它是切點與通知的結合,切入系統的一個切面,比如事務管理、日記管理等[2]。
OOP(面向對象編程)借助于面向對象的分析、設計思想,開發人員可以將現實領域的實體轉換為軟件系統中的對象,OOP中一切事物皆對象的思想很好的應用于軟件系統中,但是其也有不足之處,OOP允許定義從左到右的關系,但例如日志記錄,事務管理,這些代碼水平的分布在所有對象的層次中,而與它所分布到的對象的核心功能毫無關系,在OOP設計中,它導致了大量的重復代碼的出現,不利于系統的維護。
AOP它是OOP技術的一種補充,它是利用一種稱為“橫切”的技術,剖開封裝對象的內部,并將那些影響了多個類的公共行為封裝到一個可以重用的模塊,命名為“Aspect”,即切面,意思是說將那些與業務邏輯無關的代碼,卻為業務模塊所共同調用的邏輯代碼封裝起來,以便減少系統的重復代碼,降低模塊間的耦合度,有利于系統和的可操作性與可維護性[3]。圖1是軟件系統的縱向與橫向結構圖。

圖1 系統實現AOP思想圖
切面與業務模塊是垂直的關系,我們關注的業務邏輯都是從前到后的整個生命周期的過程,而切面是橫切于各個業務功能模塊之上。
AOP分為靜態AOP與動態AOP,靜態AOP是指在預編譯階段采用Aspect技術實現的AOP,它是將切面代碼直接編譯到java類文件中。動態AOP是指將切面代碼進行動態的織入實現的AOP。SpringAOP為動態的AOP,實現技術為JDK提供的動態代理技術和CGLIB(動態字節碼增強技術)。兩者實現技術不一樣,但都是基于代理模式,生成一個代理對象[4]。
AspectJ是一個基于java語言的AOP框架,提供了強大的AOP功能,其他很多AOP框架都借鑒后采納其中的一些思想。AspectJ是一種基于預編譯的AOP實現方式,即在編譯階段就對目標類進行修改,得到的class文件已經是被修改過的,生成靜態的AOP代理類,支持編譯時織入切面,即所謂的CTW 機制[5]。
在一個Web系統中,日志管理記錄是必不可少的,屬于系統級的交叉業務,我們可以將其放在切面中實現。由于日志文件提供的信息更方便程序開發人員查看程序異常,所以我們把系統的異常信息通過日志文件的形式進行輸出。下面,我們將結合道路運輸管理服務平臺系統管理員操作用戶模塊的實現來說明如何在Web系統應用AspectJ技術實現日志記錄的管理。
系統中我們需求是管理員在操作用戶模塊的時候要記錄管理員的操作記錄,記錄是哪個管理員增加修改刪除了內容,從而確定責任,一次需要對每條信息的增刪改行為進行日志記錄。日志系統需要記錄管理員的名字,操作時間,操作信息以及用戶數據信息以備后期查詢。
系統在這里采用基于Annotation的“零配置”方式。首先啟用Spring對Aspect切面配置的支持[6]。在配置文件 spring-mybatis.xml(本系統為spring與mybatis整合的系統)中加入如下代碼:


當啟動@AspectJ支持后,接下來定義切面類,添加@AspectJ,spring容器會自動識別該類作為切面類處理,添加@conponent,以便bean容器將該類掃描進去[7]。代碼如下:

定義對象yqUserMapper是為了操作數據庫,將管理員即將改變數據庫用戶的數據信息提取出來。
這里采用Annotation標注的通知方法定義切入點的,好處是其他通知可以共用這個切入點,定義pointcut,用于對service層中一某種命名規范開頭的方法進行攔截[8,9]。代碼如下:

切入點表達式,指定配置com.ycig.istp.yqt.service.impl包下YQUserImpl類中的所有方法作為切入點。關于切入點匹配規則表達式如圖2所示。

圖2 切入點匹配規則表達式
@Before表示目標方法執行前先執行該通知對應的方法,@Around表示目標方法執行前后執行該通知對應的方法,@After表示目標方法執行后執行該通知對應的方法,@AfterThrowing表示目標方法產生異常時執行該通知對應的方法[10,11]。
代碼示例如下:


由于本軟件系統的業務邏輯主要寫在controller層,如要攔截controller層中方法異常時執行異常通知,必須想辦法監聽controller層方法是否產生異常,切面類代碼如下:

SpringAop也是AOP技術中一種,屬于動態形式AOP,其提供兩種方式來生成代理對象,JDKProxy和Cglib,具體那種方式生成有AopProxyFactory根據AdviseSupport對象的配置來決定,JDK代理只支持基于接口的代理,而不支持基于類的代理。默認的策略是如果目標類是接口,則使用JDK動態代理技術,否則使用CGLIB來生成代理[12-13]。
事務是訪問數據庫的一個操作序列,數據庫應用系統通過事務集來完成對數據庫的存取,事務管理模塊對于大型應用系統,尤其是并發性能強的實行系統極為重要,它是確定系統能夠正確穩定運行的關鍵,事務管理就是對一系列的數據庫操作進行過統一的提交或回滾操作[14]。
本系統的事務管理是采用基于JDK的動態代理方法方式,引入 spring-aop.jar包,在 springmybatis.xml文件中配置<tx:annotation-driven transaction-manager="transactionManager"/>,因為采用的是JDK動態代理,所以@Transactional注解放在service層實現類與接口上都可以,一般放在實現類上[15],代理類實例代碼如下:

這樣業務層被@Transactional注解過的類或方法進行數據庫操作時都將調用數據庫的事務機制。
采用CGLIB動態代理技術實現系統事務管理功能的配置如下:
首先在 springmvc.xml文件中配置<aop:aspectjautoproxy proxy-target-class="true"/>
代碼,即將代理權由JDK代理交給CGLIB代理,再引用cglib的jar包即可,在基于CGLIB代理的AOP中@Transactional注解要寫在具體類或類中方法之上,Spring使用CGLIB動態代理,而內部通過Cglib2AopProxy實現代理,通過DynamicAdvisedInterceptor進行攔截:

面向切面編程方法廣泛應用于具有橫切性質的系統級服務,很好的解決了橫切關注點問題以及相關的設計難題,實現了松耦合的目的。通過AOP框架技術來實現調用方法時加入切面,在AOP框架中可以方便的使用預定義切入點來定義被調用的類和方法。在以后的內容系統管理等各領域中,AOP技術會有更多的應用。
[1]魏文清,石亮紅,武寶珠.用AOP技術實現Web系統中的日志管理[J].江西科學,2010,28(4):528-530.
[2]李健,田立鋒,郭瑞.java SSH框架在java Web中的應用[J].學術探討應用技術與研究,2016,23(3):45-47.
[3]王書懷,刑建春,李決龍,等.AOP技術在管理信息系統中的應用研究[J].計算機應用于軟件,2012,29(6):189-195.
[4]薛冰.改進AOP技術在軟件開發中的應用于研究[D].大連:大連交通大學,2013.
[5]劉旭斌,朱國斌,關培超,等.AOP在地理信息服務平臺日志系統中的應用[J].地理空間信息,2014,12(4:)27-33.
[6]彭雪昶,吳海,張淼.面向切面方法實現日志管理的研究與設計[J].數據庫與信息管理,2014,24(44):101-103.
[7]多結仁欠.SSH框架技術在文件系統中的應用研究[J].西藏大學現代教育技術中心,2011,34(31):56-59.
[8]錢慎一,付中舉,林青.AOP技術在數據交換與共享系統中的應用[J].鄭州輕工業學院學報,2012,27(6):14-16.
[9]王振智,王開義,喻鋼.AOP技術在農資信息管理平臺中的應用[J].農機化研究,2010,43(6):153-157.
[10]王艷清,陳紅.基于SSM框架的只能Web系統研發設計[J].計算機工程與設計,2012,33(12):4752-4757.
[11]Breivold H.A systematic review of software architecture evolution research [J].Infomation and Software Technolo-gy,2012:16-40.
[12]孟若.基于AOP的Web服務演化方法[D].武漢:武漢工程大學,2015.
[13]陳寧,李星.基于AOP架構的業務約束檢測[J].計算機工程與應用,2012,48(22):74-78.
[14]劉敏,陳寧,康迪,等.基于JAVA動態代理的AOP實現機制[J].科研發展,2014,22(13):65.
[15]王添財.基于Java EE的在線考試系統的設計與實現[D].廣州:華南理工大學,2014.
Log and transaction management in Web system based on Aspect-Oriented Programming
TANG Nian-gang1,ZHANG Yong2
(1.Wuhan Research Institute of Posts and Telecommunications,Wuhan 430070,China;2.The Wuhan Yangtze Communications Technology Co.Ltd,Wuhan 430070,China)
A complete software project system is divided into core business concerns and system level aspects of concern,Using AOP technology can separate the business logic and system level logic in the Web system,To achieve the purpose of loose coupling.This paper firstly introduces the concept and principle of AOP technology,and then combined with a system example to introduce two kinds of AOP technology in the log management and transaction management of the application,and finally prove its feasibility.
Web system; AOP technology; log management; transaction management
TN01
A
1674-6236(2017)16-0042-04
2016-07-20稿件編號:201607144
唐念剛(1991—),男,湖南永州人,碩士研究生。研究方向:通信與信息系統,軟件設計。