摘要: 針對目前J2EE應(yīng)用系統(tǒng)項目開發(fā)存在交付滯后、維護性差等問題,提出了一種新的軟件自動生成方法。設(shè)計了代碼自動生成引擎的總體框架,給出了各個組成部分的詳細(xì)設(shè)計方案,對關(guān)鍵組件進(jìn)行了具體實現(xiàn)。該引擎為提高軟件開發(fā)效率和降低軟件開發(fā)成本提供了一種行之有效的途徑和方法,在一定程度上降低了軟件開發(fā)的風(fēng)險。在實際項目開發(fā)中驗證了該系統(tǒng)的可行性。
關(guān)鍵詞: J2EE框架; 代碼自動生成; 軟件架構(gòu); 開發(fā)風(fēng)險
中圖分類號:TP311文獻(xiàn)標(biāo)志碼:A 文章編號:1006-8228(2012)11-42-02
Design and implementation of an engine generating codesautomatically based on J2EE architecture
Xu Aichun
(Huzhou Vocational & Technical College, Huzhou, Zhejiang 313000, China)
Abstract: An automatic generation method of codes based on J2EE is given in order to solve those problems such as delayed application delivery and poor maintenance. In this paper, a key detailed schema and method are introduced to realize code generating system after designing a system framework. An effective method is proposed to improve software development efficiency and reduce development costs. It reduces the risk in software development. Feasibility is verified in application process.
Key words: J2EE architecture; code generation; software architecture; development risk
0 引言
隨著企事業(yè)單位信息化系統(tǒng)的迅速普及,基于J2EE架構(gòu)的技術(shù)已經(jīng)在各個系統(tǒng)開發(fā)中得到了廣泛的應(yīng)用。目前,在J2EE體系架構(gòu)中,各種開源框架的J2EE架構(gòu)已經(jīng)比較成熟和穩(wěn)定,并逐漸成為軟件項目開發(fā)的首選和主流,優(yōu)秀的開源框架在J2EE中的應(yīng)用在一定程度上也促進(jìn)了企業(yè)級應(yīng)用的發(fā)展[1,2]。
基于J2EE輕型框架的開發(fā)給項目開發(fā)帶來了革命性的突破。利用J2EE輕型框架[3,4],可以針對項目進(jìn)行研發(fā)分層,實現(xiàn)項目的快速開發(fā)。但從現(xiàn)狀來看,還面臨著一些新的問題。
⑴ 項目過于集中,開發(fā)產(chǎn)能嚴(yán)重不足
由于大環(huán)境以及實際情況的影響,造成了項目開發(fā)往往集中在一個時間段內(nèi),而人力產(chǎn)能是單位時間內(nèi)有限的關(guān)鍵資源,這會造成資源上的沖突,這種沖突會影響到公司承接項目的并行開發(fā)能力。
⑵ 項目工期緊,需求變更頻繁,質(zhì)量要求高
信息系統(tǒng)建設(shè)單位往往對時間要求很嚴(yán)格,質(zhì)量要求高,在時間非常緊張的情況下,變更需求以至重新設(shè)計并且編碼,無疑是對研發(fā)人員的嚴(yán)峻的考驗,研發(fā)壓力大,項目工期緊,項目質(zhì)量有可能下降。
⑶ 系統(tǒng)可維護性差
由于開發(fā)人員風(fēng)格有所不同,水平參差不齊,他們編寫的代碼千差萬別,造成了程序風(fēng)格不統(tǒng)一,修改、維護也很不方便,這最終造成項目維護的效率下降。
對于上述這些問題,我們迫切需要一種新的研發(fā)模式替代以前的研發(fā)模式。針對J2EE平臺上開發(fā)的應(yīng)用軟件,需要一個基于關(guān)系數(shù)據(jù)庫的應(yīng)用軟件的J2EE平臺的代碼自動生成引擎,實現(xiàn)基于關(guān)系數(shù)據(jù)庫的業(yè)務(wù)系統(tǒng)的設(shè)計成果到實現(xiàn)代碼的快速轉(zhuǎn)化,并且可以實現(xiàn)由非J2EE的基于關(guān)系數(shù)據(jù)庫的應(yīng)用到先進(jìn)的J2EE的平臺的快速轉(zhuǎn)化??s短設(shè)計到代碼實現(xiàn)的轉(zhuǎn)化時間,節(jié)約人力資源的成本。最大限度地提高代碼重用性、易維護性以及減輕開發(fā)人員負(fù)擔(dān)。幫助開發(fā)人員從煩瑣的編碼的技術(shù)細(xì)節(jié)中解脫出來,把更多的時間和精力投入到業(yè)務(wù)問題的分析和研究上,提高軟件的質(zhì)量。
本文在研究各個開源框架的基礎(chǔ)上,集成J2EE各層核心技術(shù),開發(fā)了一套面向J2EE輕型框架應(yīng)用的代碼自動生成引擎[5],并在實際開發(fā)中得到了驗證,取得了良好的應(yīng)用效果。
1 系統(tǒng)總體框架
根據(jù)上述業(yè)務(wù)需求,結(jié)合J2EE應(yīng)用系統(tǒng)各個層級之間的關(guān)系,本引擎的總體框架設(shè)計如圖1所示。
圖1總體框架
首先根據(jù)用戶的業(yè)務(wù)需求進(jìn)行建模,然后在此基礎(chǔ)上進(jìn)行數(shù)據(jù)庫建模,本引擎根據(jù)數(shù)據(jù)庫各個表的字段及拓?fù)潢P(guān)系,以及相應(yīng)的業(yè)務(wù)控制文件,調(diào)用模板自動生成系統(tǒng)業(yè)務(wù)邏輯層、表示層、數(shù)據(jù)訪問層,以及各個層之間的關(guān)系配置。
2 系統(tǒng)實現(xiàn)
2.1 數(shù)據(jù)訪問層(DAO)代碼生成
數(shù)據(jù)訪問層主要實現(xiàn)與底層數(shù)據(jù)庫交互,封裝了數(shù)據(jù)的增、刪、改、查等功能,代碼自動生成引擎根據(jù)數(shù)據(jù)表的名稱和字段,以及表之間的關(guān)系,在業(yè)務(wù)配置文件的指導(dǎo)下,調(diào)用數(shù)據(jù)訪問層的模板,生成數(shù)據(jù)訪問層代碼,代碼包括DAO接口及其實現(xiàn),表的domain對象,若封裝了iBatis O/R組件,則還自動生成SqlMap XML文件。數(shù)據(jù)訪問層的接口代碼模板如下:
……
public interface
public PageInfo< className/>List( classNameLower/>,int pageNum, int pageSize); public ById(final public Long saveTo className/> …… 上述模板中,XDtClass:className為XDoclet標(biāo)簽,獲取表名稱并根據(jù)規(guī)則轉(zhuǎn)換成類名的一部分, 數(shù)據(jù)訪問層模板可以根據(jù)不同的持續(xù)化組件生成相應(yīng)實現(xiàn)代碼,如hibernate、iBatis,數(shù)據(jù)訪問層的接口iBatis實現(xiàn)代碼模板如下: …… public class implements public void save className/> = getType="getterName"/>(); if ( =( getSqlMapClientTemplate().insert("add className/>", } else { getSqlMapClientTemplate().update("update className/>", } if( throw new ObjectRetrievalFailureException( className/>.class, ="propertyName"/>); } } …… 上述模板代碼以iBatis持續(xù)化組件為基礎(chǔ),生成DAO層的接口、接口實現(xiàn)以及SqlMap,也可以按照業(yè)務(wù)需求,將相應(yīng)的模板替換成基于hibernate等持續(xù)化層的實現(xiàn)。 2.2 業(yè)務(wù)邏輯層(Service)代碼生成 業(yè)務(wù)邏輯層是整個應(yīng)用系統(tǒng)的核心,引擎根據(jù)不同業(yè)務(wù)需求定制不同的業(yè)務(wù)模板,業(yè)務(wù)邏輯層根據(jù)所接收到的Controller層不同命令進(jìn)行業(yè)務(wù)處理,然后確定應(yīng)該調(diào)度哪些數(shù)據(jù)訪問層接口。以下代碼為通用的業(yè)務(wù)邏輯層模板具體實現(xiàn)代碼: …… public class BaseService implements @Autowired private public GridPage< className/>InfoList(final String getType="propertyName"/>) { return dao.get ( } …… 業(yè)務(wù)邏輯層模板中,針對復(fù)雜的業(yè)務(wù)邏輯,應(yīng)該在代碼生成之后,根據(jù)需要進(jìn)行定制,模板只能生成業(yè)務(wù)邏輯而不是復(fù)雜的代碼。 2.3 表現(xiàn)層代碼生成 表現(xiàn)層實現(xiàn)應(yīng)用系統(tǒng)與用戶交互,表現(xiàn)層將用戶各種請求提交給控制層,控件層根據(jù)不同需求去請求業(yè)務(wù)邏輯層,并把處理結(jié)果反饋給表現(xiàn)層。表現(xiàn)層模板分為控制層(Manager),頁面表示(List,,form,js)等。代碼如下:
……
public final class
ActionSupport {
@Autowired
private className/>Service; @PermissionFilter(ename=" Management") public String enter …… PageInfo< className/>Service.getCompanyToxicPageList(queryParameter, page, rows); gridPage=new GridPage< return SUCCESS; } …… 3 結(jié)束語 本引擎在研究J2EE輕型框架核心技術(shù)的基礎(chǔ)上,增加針對企業(yè)應(yīng)用系統(tǒng)的核心業(yè)務(wù),使用模板技術(shù)自動生成基于J2EE輕型框架應(yīng)用系統(tǒng)各層的代碼。本引擎在實際使用過程中,能節(jié)省40%代碼編寫工作量,大大提高了系統(tǒng)可維護性,同時也提高了系統(tǒng)的開發(fā)效率,縮短了開發(fā)周期,提高了對客戶需求變更的響應(yīng)速度。 參考文獻(xiàn): [1] 王懷民,周斌.企業(yè)應(yīng)用架構(gòu)模式[M].機械工業(yè)出版社,2006. [2] 徐愛春,章堅民.基于XML/XLST代碼自動生成技術(shù)研究[J].杭州電 子工業(yè)學(xué)院學(xué)報,2004.24(4):64-68 [3] 徐愛春.區(qū)域化科技技術(shù)共享與服務(wù)平臺設(shè)計與實現(xiàn)[J].現(xiàn)代情報, 2010.3:71-74 [4] 徐愛春.電子商務(wù)教學(xué)資源庫共享服務(wù)平臺的研究與實現(xiàn)[J].湖州職 業(yè)技術(shù)學(xué)院學(xué)報,2012.1:22-25 [5] Andresson.Overview and Industrial Application Of Code generators [J].Journal of System and Software,2004.32(3):185-214