鄭建華 陳爾曉
摘要:在分析了MVC模式對AOP技術(shù)支持的不足之后,提出了MVCA模式,該模式將橫切關(guān)注點封裝成方面層,并動態(tài)隱形地織入到MVC各層中。最后通過羅定市茶葉產(chǎn)業(yè)科技集成服務(wù)平臺設(shè)計實例闡述了MVCA模式的應(yīng)用,并解析了基于配置文件的動態(tài)隱形織入技術(shù)。
關(guān)鍵詞:面向方面編程;MVCA模式;橫切關(guān)注點
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2012)01-0199-02
Design and Application Research of MVCA Pattern
ZHENG Jian-hua, CHEN Er-xiao
(Department of Computer science & Eng. ,ZhongKai University of Agriculture & Eng., Guangzhou 510225, China)
Abstract: After analyzing the deficiency of MVC mode for supporting AOP technology, MVCA mode was proposed, which capsulate the cross-cutting concerns as aspect layer and can dynamically and invisibly weave aspect into MVC layer. In the end the paper analyses the ap? plication of MVCA Pattern by an example of LuoDing City Technology Integration Service Platform for Tea ,and explain the dynamically and invisibly weaving technology by configuration file.
Key words: Aspect-Oriented Programming(AOP); MVCA mode ; cross-cutting concern
在傳統(tǒng)的面對對象程序設(shè)計中,如日志,安全,異常處理等這樣系統(tǒng)級的橫切關(guān)注點經(jīng)常和系統(tǒng)的核心應(yīng)用邏輯形成代碼交織,使得已存在的遺留代碼難于維護和理解。面向方面編程[1](Aspect-Oriented Programming :AOP)它以解決橫切關(guān)注點為出發(fā)點,用最小的耦合處理每個關(guān)注點,將橫切關(guān)注點封裝在一個獨立的模塊里,通過系統(tǒng)全模塊化的方式降低軟件復(fù)雜性,促進核心功能模塊和橫切關(guān)注點模塊彼此的復(fù)用。當前Web應(yīng)用軟件廣泛采用MVC三層架構(gòu)模式,能實現(xiàn)通過控制器來聯(lián)系表示層和業(yè)務(wù)層,有效降低了兩個層次之間的耦合,降低了系統(tǒng)開發(fā)的復(fù)雜度。但是MVC模式并沒有直接支持AOP技術(shù),而文獻[2]僅僅考慮了在MVC模式中的業(yè)務(wù)層內(nèi)融合AOP的設(shè)計。對一個Web應(yīng)用而言,隨著功能和規(guī)模的擴大,各層的復(fù)雜性都會增加,為此本文設(shè)計了MVCA模式,并基于MVCA模式實現(xiàn)了Web系統(tǒng)的開發(fā)。
1 MVC模式分析
模型(Model)-視圖(View)-控制器(Controller)(MVC)是Xerox PARC在八十年代為編程語言Smalltalk-80發(fā)明的一種軟件設(shè)計模式,至今已被廣泛使用。對于MVC模式[3]來說,其優(yōu)點主要是使得各個層次分工明確、實現(xiàn)了各層的解耦合,但是隨著軟件的規(guī)模的不斷發(fā)展,特別是隨著橫切關(guān)注點的提出后,MVC模式表現(xiàn)出一定的不適用性,MVC模式中重點關(guān)注核心關(guān)注點,對于橫切關(guān)注點則沒有單獨考慮進來,在每個層次中依然摻雜著橫切關(guān)注點,只要開發(fā)系統(tǒng)能夠滿足基本的客戶要求的業(yè)務(wù)功能即可,這些橫切關(guān)注點功能都是在開發(fā)完成時逐步添加到核心關(guān)注點上,這種開發(fā)開發(fā)方式本文稱為“混雜式開發(fā)”,其存在以下不足:1)“混雜式開發(fā)”使得系統(tǒng)橫切和核心關(guān)注代碼交織,系統(tǒng)模塊化不徹底;2)由于模塊化不徹底,使得核心和橫切關(guān)注點模塊不能重用,導(dǎo)致模塊重用性低;3)由于橫切和核心關(guān)注點代碼交織,對系統(tǒng)的修改容易破壞“開放封閉”原則,系統(tǒng)擴展性低。
2 MVCA模式設(shè)計
針對MVC模式的不足以及在開發(fā)中所遇到的問題,本文提出MVCA模式,MVCA模式在MVC模式的基礎(chǔ)上添加方面層(Aspect),形成了控制層、模型層、視圖層、方面層的四層架構(gòu)。方面是對橫切關(guān)注點的封裝,每一個層次的操作當要使用到橫切關(guān)注點的時,Aspect就會主動地插入到某一層的某個步驟當中,而這種插入對于控制層和模型層是隱藏的,控制層和模型層不知道方面的存在,這樣在MVCA模式中,程序員不必修改原有的代碼,只是編寫方面層,最后采用AOP技術(shù)織入到其他三層當中,本文稱這種開發(fā)方式為“編織式開發(fā)”,MVCA模式如圖1所示。途中的虛線表示了方面層對其他各層的“織入”作用。
與MVC模式相比,MVCA模式的優(yōu)勢主要表現(xiàn)在以下方面:
1)徹底地模塊化
MVCA模式把系統(tǒng)的關(guān)注點分為核心關(guān)注點和橫切關(guān)注點,再把橫切關(guān)注點織入到系統(tǒng)各個模塊中,這樣就把系統(tǒng)劃分為主要的核心模塊和橫切模塊,使得系統(tǒng)徹底地模塊化和系統(tǒng)徹底地解耦。
2)復(fù)用性高
MVCA模式中開發(fā)出來的Aspect層具有高度的可復(fù)用性,這樣使得系統(tǒng)的核心關(guān)注點和橫切關(guān)注點都可以實現(xiàn)復(fù)用,從而加快了開發(fā)的效率。
3)擴展性強
擴展性強的系統(tǒng)可以快速適應(yīng)系統(tǒng)的需求變更,MVCA模式引入了Aspect層,并采用“編織式開發(fā)”,使得開發(fā)人員可以只關(guān)注業(yè)務(wù)變更模塊的修改,而無需關(guān)注橫切關(guān)注點對不同模塊的影響,加快了系統(tǒng)對業(yè)務(wù)需求變更的響應(yīng)。
3實例應(yīng)用及基于配置的動態(tài)隱形織入技術(shù)分析
本小節(jié)基于上節(jié)提出的MVCA模式開發(fā)了羅定市生態(tài)茶葉產(chǎn)業(yè)科技集成服務(wù)平臺,、該平臺主要包括:茶葉生產(chǎn)服務(wù)、茶葉文化、茶葉產(chǎn)品流通服務(wù)、科技培訓(xùn)服務(wù)等模塊,這些模塊將作為系統(tǒng)的核心關(guān)注點模塊,同時本文把系統(tǒng)日志的記錄、權(quán)限的認證、安全性檢查、異常的拋出等抽取出來當做方面,形成方面層,作為系統(tǒng)的橫切關(guān)注點模塊,在具體應(yīng)用時再采用“動態(tài)隱形織入”技術(shù)織入各核心關(guān)注點模塊中,以下以日志記錄為例,講述了日志記錄如何動態(tài)隱形織入到其他層次當中。
日志的記錄能夠有效地記錄了用戶進行的操作,系統(tǒng)出現(xiàn)的問題等功能,能夠幫助開發(fā)更好地了解系統(tǒng)的糾錯和系統(tǒng)的性能。日志記錄是橫切到系統(tǒng)的各個模塊,這些模塊的操作之后都要進行日志的記錄。故本文將這些日志記錄功能從系統(tǒng)中單獨分離出來當作一個日志方面,并在系統(tǒng)各個模塊不知情的情況下進行動態(tài)隱形織入,即在各個模塊中并沒有顯示調(diào)用日志記錄的方面模塊,但是日志記錄方面模塊已經(jīng)隱式地注入到這些模塊當中。圖2是各個模塊中需要動態(tài)的織入日志處理結(jié)構(gòu)圖。
圖2中的茶葉生產(chǎn)服務(wù)、茶葉文化、茶葉產(chǎn)品流通服務(wù)、科技培訓(xùn)服務(wù)等模塊進行業(yè)務(wù)邏輯操作時需要進行日志記錄,本系統(tǒng)中將日志記錄作為一個Aspect模塊(日志方面)動態(tài)地織入(Weaving)到以上四個模塊當中,對于以上的四個模塊而言其根本不知道日志方面的存在??椚氩僮鞅疚闹饕捎没谂渲梦募姆绞絹韺崿F(xiàn)隱形動態(tài)織入,以盡量減少模塊間的耦合。配置的代碼如下所示:
其中id是日志方面的標識,用于標識確定唯一一個方面;
ref=”loggerTeaProduceServiceAop”說明了應(yīng)用了功能庫層中的橫切功能庫中LoggerTeaProduceServiceAop方面類;
method指定應(yīng)用LoggerTeaProduceServiceAop方面類里的哪個方法;
pointcut指定動態(tài)插入到哪里執(zhí)行。比如:
表示cn.easier.business.logger.service.impl包下的TeaProduceServiceImpl類的insertGWErrorLogger方法,任意返回值和任意的參數(shù)。
4結(jié)束語
隨著軟件復(fù)雜度性的增加和規(guī)模的變大,必須考慮核心關(guān)注點和橫切關(guān)注點分離的問題,雖然AOP技術(shù)是解決橫切關(guān)注點的有效手段。但是現(xiàn)有的MVC模式并不能很好的支持AOP技術(shù),為此本文提出了MVCA模式,該模式將橫切關(guān)注點封裝成方面層,并動態(tài)隱形地織入到MVC各層中,通過該模式能實現(xiàn)系統(tǒng)徹底模塊化,以及具有高復(fù)用性和擴展性強等優(yōu)點。后續(xù)的研究將在此基礎(chǔ)上,設(shè)計基于MVCA模式的多層Web系統(tǒng)架構(gòu),以便更好的支持WEB系統(tǒng)開發(fā)。
參考文獻:
[1]曹東剛,梅宏.面向Aspect的程序設(shè)計-一種新的編程范型[J].計算機科學(xué),2003,30(9):5-10.
[2]趙成勇,周南,張曉泉.基于AOP與MVC模式的Web應(yīng)用架構(gòu)的設(shè)計與實現(xiàn)[J].南京大學(xué)學(xué)報:自然科學(xué)版,2005,41(10):718-724.
[3]黎永良,崔杜武.MVC設(shè)計模式的改進與應(yīng)用[J].計算機工程,2005(9):96-98.