唐念剛,張 勇
(1.武漢郵電科學研究院 湖北 武漢 430070;2.武漢長江通信智聯(lián)技術有限公司 湖北 武漢430070)
AOP技術在Web系統(tǒng)日志和事物管理中的應用
唐念剛1,張 勇2
(1.武漢郵電科學研究院 湖北 武漢 430070;2.武漢長江通信智聯(lián)技術有限公司 湖北 武漢430070)
一個完整的軟件項目系統(tǒng)分為核心業(yè)務關注點與系統(tǒng)級的方面關注點,利用AOP技術可以在Web系統(tǒng)中將項目中的業(yè)務邏輯與系統(tǒng)級邏輯進行分離,達到松耦合的目的。文章首先介紹AOP技術的概念與原理,然后結合一個系統(tǒng)實例介紹兩種AOP技術分別在日志和事物管理中應用,并證明其可行性。
Web系統(tǒng);AOP技術;日志管理;事物管理
當前,Web項目系統(tǒng)日趨復雜與龐大,應用也越來越廣泛,為目前最重要的基于文檔的分布式系統(tǒng)。
日志管理功能模塊在系統(tǒng)開發(fā)與應用中起著重要作用,系統(tǒng)日志管理可以記錄下系統(tǒng)進行的一系列行為信息,包括開發(fā)人員在開發(fā)過程中調試異常操作的信息數(shù)據(jù),用戶在系統(tǒng)操作過程中記錄下的信息,提高了開發(fā)人員的開發(fā)效率,也提升了系統(tǒng)的安全性以及可操作性。事務管理模塊的作用是對系統(tǒng)數(shù)據(jù)庫操作進行統(tǒng)一的提交或回滾,以便服務器保持數(shù)據(jù)的完整性,事務管理模塊對于大型應用系統(tǒng),尤其是并發(fā)性強的實時系統(tǒng)極為重要,保證系統(tǒng)能夠正確順利的運行。
傳統(tǒng)的日志與事務管理模塊的設計中代碼重復與代碼散亂給開發(fā)與維護帶來了較大的困難。以關注點分離為核心思想的面向切面編程技術(AOP)能很好的解決上述問題,利用AOP技術可以在Web系統(tǒng)中將項目中的業(yè)務邏輯與系統(tǒng)級邏輯進行分離,減少重復代碼,達到松耦合的目的[1]。
AOP(Aspect Oriented Programming)即面向切面編程,可以將一些系統(tǒng)相關的工程,獨立提取出來,然后通過切面切入到系統(tǒng),從而避免了在業(yè)務邏輯的代碼中混入過多的系統(tǒng)相關的代碼,比如事務管理、日志處理記錄等等,實現(xiàn)了系統(tǒng)松耦合的特點。AOP的幾個關鍵術語分別為:
1)連接點(Joint Point)是程序執(zhí)行過程中可以切入的點,它可以是對一個函數(shù)的調用或者是對象的一個屬性。
2)切入點(PointCut)符合切點表達式的連接點,也就是真正切入的地方。
3)通知(Advice)切面在某個連接點執(zhí)行的操作,它可以分為前置通知(Before Advice)、后置通知(After Advice)、環(huán)繞通知(Around Advice)及異常通知(Throwing Advice)等,分別表示在調用或執(zhí)行方法的不同位置處切入。
4)Aspect(切面)它是切點與通知的結合,切入系統(tǒng)的一個切面,比如事務管理、日記管理等[2]。
OOP(面向對象編程)借助于面向對象的分析、設計思想,開發(fā)人員可以將現(xiàn)實領域的實體轉換為軟件系統(tǒng)中的對象,OOP中一切事物皆對象的思想很好的應用于軟件系統(tǒng)中,但是其也有不足之處,OOP允許定義從左到右的關系,但例如日志記錄,事務管理,這些代碼水平的分布在所有對象的層次中,而與它所分布到的對象的核心功能毫無關系,在OOP設計中,它導致了大量的重復代碼的出現(xiàn),不利于系統(tǒng)的維護。
AOP它是OOP技術的一種補充,它是利用一種稱為“橫切”的技術,剖開封裝對象的內部,并將那些影響了多個類的公共行為封裝到一個可以重用的模塊,命名為“Aspect”,即切面,意思是說將那些與業(yè)務邏輯無關的代碼,卻為業(yè)務模塊所共同調用的邏輯代碼封裝起來,以便減少系統(tǒng)的重復代碼,降低模塊間的耦合度,有利于系統(tǒng)和的可操作性與可維護性[3]。圖1是軟件系統(tǒng)的縱向與橫向結構圖。
圖1 系統(tǒng)實現(xiàn)AOP思想圖
切面與業(yè)務模塊是垂直的關系,我們關注的業(yè)務邏輯都是從前到后的整個生命周期的過程,而切面是橫切于各個業(yè)務功能模塊之上。
AOP分為靜態(tài)AOP與動態(tài)AOP,靜態(tài)AOP是指在預編譯階段采用Aspect技術實現(xiàn)的AOP,它是將切面代碼直接編譯到java類文件中。動態(tài)AOP是指將切面代碼進行動態(tài)的織入實現(xiàn)的AOP。SpringAOP為動態(tài)的AOP,實現(xiàn)技術為JDK提供的動態(tài)代理技術和CGLIB(動態(tài)字節(jié)碼增強技術)。兩者實現(xiàn)技術不一樣,但都是基于代理模式,生成一個代理對象[4]。
AspectJ是一個基于java語言的AOP框架,提供了強大的AOP功能,其他很多AOP框架都借鑒后采納其中的一些思想。AspectJ是一種基于預編譯的AOP實現(xiàn)方式,即在編譯階段就對目標類進行修改,得到的class文件已經(jīng)是被修改過的,生成靜態(tài)的AOP代理類,支持編譯時織入切面,即所謂的CTW 機制[5]。
在一個Web系統(tǒng)中,日志管理記錄是必不可少的,屬于系統(tǒng)級的交叉業(yè)務,我們可以將其放在切面中實現(xiàn)。由于日志文件提供的信息更方便程序開發(fā)人員查看程序異常,所以我們把系統(tǒng)的異常信息通過日志文件的形式進行輸出。下面,我們將結合道路運輸管理服務平臺系統(tǒng)管理員操作用戶模塊的實現(xiàn)來說明如何在Web系統(tǒng)應用AspectJ技術實現(xiàn)日志記錄的管理。
系統(tǒng)中我們需求是管理員在操作用戶模塊的時候要記錄管理員的操作記錄,記錄是哪個管理員增加修改刪除了內容,從而確定責任,一次需要對每條信息的增刪改行為進行日志記錄。日志系統(tǒng)需要記錄管理員的名字,操作時間,操作信息以及用戶數(shù)據(jù)信息以備后期查詢。
系統(tǒng)在這里采用基于Annotation的“零配置”方式。首先啟用Spring對Aspect切面配置的支持[6]。在配置文件 spring-mybatis.xml(本系統(tǒng)為spring與mybatis整合的系統(tǒng))中加入如下代碼:
當啟動@AspectJ支持后,接下來定義切面類,添加@AspectJ,spring容器會自動識別該類作為切面類處理,添加@conponent,以便bean容器將該類掃描進去[7]。代碼如下:
定義對象yqUserMapper是為了操作數(shù)據(jù)庫,將管理員即將改變數(shù)據(jù)庫用戶的數(shù)據(jù)信息提取出來。
這里采用Annotation標注的通知方法定義切入點的,好處是其他通知可以共用這個切入點,定義pointcut,用于對service層中一某種命名規(guī)范開頭的方法進行攔截[8,9]。代碼如下:
切入點表達式,指定配置com.ycig.istp.yqt.service.impl包下YQUserImpl類中的所有方法作為切入點。關于切入點匹配規(guī)則表達式如圖2所示。
圖2 切入點匹配規(guī)則表達式
@Before表示目標方法執(zhí)行前先執(zhí)行該通知對應的方法,@Around表示目標方法執(zhí)行前后執(zhí)行該通知對應的方法,@After表示目標方法執(zhí)行后執(zhí)行該通知對應的方法,@AfterThrowing表示目標方法產(chǎn)生異常時執(zhí)行該通知對應的方法[10,11]。
代碼示例如下:
由于本軟件系統(tǒng)的業(yè)務邏輯主要寫在controller層,如要攔截controller層中方法異常時執(zhí)行異常通知,必須想辦法監(jiān)聽controller層方法是否產(chǎn)生異常,切面類代碼如下:
SpringAop也是AOP技術中一種,屬于動態(tài)形式AOP,其提供兩種方式來生成代理對象,JDKProxy和Cglib,具體那種方式生成有AopProxyFactory根據(jù)AdviseSupport對象的配置來決定,JDK代理只支持基于接口的代理,而不支持基于類的代理。默認的策略是如果目標類是接口,則使用JDK動態(tài)代理技術,否則使用CGLIB來生成代理[12-13]。
事務是訪問數(shù)據(jù)庫的一個操作序列,數(shù)據(jù)庫應用系統(tǒng)通過事務集來完成對數(shù)據(jù)庫的存取,事務管理模塊對于大型應用系統(tǒng),尤其是并發(fā)性能強的實行系統(tǒng)極為重要,它是確定系統(tǒng)能夠正確穩(wěn)定運行的關鍵,事務管理就是對一系列的數(shù)據(jù)庫操作進行過統(tǒng)一的提交或回滾操作[14]。
本系統(tǒng)的事務管理是采用基于JDK的動態(tài)代理方法方式,引入 spring-aop.jar包,在 springmybatis.xml文件中配置<tx:annotation-driven transaction-manager="transactionManager"/>,因為采用的是JDK動態(tài)代理,所以@Transactional注解放在service層實現(xiàn)類與接口上都可以,一般放在實現(xiàn)類上[15],代理類實例代碼如下:
這樣業(yè)務層被@Transactional注解過的類或方法進行數(shù)據(jù)庫操作時都將調用數(shù)據(jù)庫的事務機制。
采用CGLIB動態(tài)代理技術實現(xiàn)系統(tǒng)事務管理功能的配置如下:
首先在 springmvc.xml文件中配置<aop:aspectjautoproxy proxy-target-class="true"/>
代碼,即將代理權由JDK代理交給CGLIB代理,再引用cglib的jar包即可,在基于CGLIB代理的AOP中@Transactional注解要寫在具體類或類中方法之上,Spring使用CGLIB動態(tài)代理,而內部通過Cglib2AopProxy實現(xiàn)代理,通過DynamicAdvisedInterceptor進行攔截:
面向切面編程方法廣泛應用于具有橫切性質的系統(tǒng)級服務,很好的解決了橫切關注點問題以及相關的設計難題,實現(xiàn)了松耦合的目的。通過AOP框架技術來實現(xiàn)調用方法時加入切面,在AOP框架中可以方便的使用預定義切入點來定義被調用的類和方法。在以后的內容系統(tǒng)管理等各領域中,AOP技術會有更多的應用。
[1]魏文清,石亮紅,武寶珠.用AOP技術實現(xiàn)Web系統(tǒng)中的日志管理[J].江西科學,2010,28(4):528-530.
[2]李健,田立鋒,郭瑞.java SSH框架在java Web中的應用[J].學術探討應用技術與研究,2016,23(3):45-47.
[3]王書懷,刑建春,李決龍,等.AOP技術在管理信息系統(tǒng)中的應用研究[J].計算機應用于軟件,2012,29(6):189-195.
[4]薛冰.改進AOP技術在軟件開發(fā)中的應用于研究[D].大連:大連交通大學,2013.
[5]劉旭斌,朱國斌,關培超,等.AOP在地理信息服務平臺日志系統(tǒng)中的應用[J].地理空間信息,2014,12(4:)27-33.
[6]彭雪昶,吳海,張淼.面向切面方法實現(xiàn)日志管理的研究與設計[J].數(shù)據(jù)庫與信息管理,2014,24(44):101-103.
[7]多結仁欠.SSH框架技術在文件系統(tǒng)中的應用研究[J].西藏大學現(xiàn)代教育技術中心,2011,34(31):56-59.
[8]錢慎一,付中舉,林青.AOP技術在數(shù)據(jù)交換與共享系統(tǒng)中的應用[J].鄭州輕工業(yè)學院學報,2012,27(6):14-16.
[9]王振智,王開義,喻鋼.AOP技術在農(nóng)資信息管理平臺中的應用[J].農(nóng)機化研究,2010,43(6):153-157.
[10]王艷清,陳紅.基于SSM框架的只能Web系統(tǒng)研發(fā)設計[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架構的業(yè)務約束檢測[J].計算機工程與應用,2012,48(22):74-78.
[14]劉敏,陳寧,康迪,等.基于JAVA動態(tài)代理的AOP實現(xiàn)機制[J].科研發(fā)展,2014,22(13):65.
[15]王添財.基于Java EE的在線考試系統(tǒng)的設計與實現(xiàn)[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—),男,湖南永州人,碩士研究生。研究方向:通信與信息系統(tǒng),軟件設計。