e代劍客——溫柔一刀

          生活就像海洋,只有意志堅(jiān)強(qiáng)的人,才能到達(dá)彼岸

             :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            76 隨筆 :: 7 文章 :: 215 評(píng)論 :: 0 Trackbacks
          作者注:在《Better, Faster, Lighter Java》一書(shū)第八章的這份節(jié)錄中,我們將看到一個(gè)使用Spring框架的企業(yè)web應(yīng)用程序例子。盡管Hibernate提供了單個(gè)的服務(wù),Spring框架卻提供了一種高效地構(gòu)建和匯編Java應(yīng)用程序的方法,以及多種服務(wù)的抽象。盡管Spring支持多種服務(wù),但是它最受關(guān)注也是最出色的特性是杰出的分層和封裝。與EJB一樣,Spring的中心組件是一個(gè)容器;而且Spring框架也同樣提供對(duì)核心J2EE服務(wù)的訪問(wèn)。但是這就是它們僅有的相似之處了。下面是一個(gè)比喻。

            我喜歡皮劃艇運(yùn)動(dòng),也花了很多時(shí)間來(lái)教授皮劃艇技巧。我的一個(gè)專長(zhǎng)就是教授學(xué)生如何在浪花中翻轉(zhuǎn)弄翻了的皮劃艇。一天,我向一位四肢發(fā)達(dá)的大個(gè)子和一位玲瓏瘦小、體重只有97磅的女士傳授該技巧。當(dāng)我在陸地上從頭到尾仔細(xì)地講述這項(xiàng)技巧的時(shí)候,大個(gè)子直勾勾的盯著遠(yuǎn)方,不感興趣。而那位女士注意力集中,而且希望反復(fù)練習(xí)這項(xiàng)基礎(chǔ)技巧。在半個(gè)小時(shí)之內(nèi),她就出色地完成了第一次翻轉(zhuǎn),而他只是上下?lián)u擺,在平靜的水面上拍打出細(xì)小的白色泡沫。直到第三個(gè)學(xué)時(shí),他才完成這個(gè)動(dòng)作。在以后的幾個(gè)學(xué)時(shí)中,她依靠技巧快速提高,而他卻單憑力量在水中掙扎。到了實(shí)踐的時(shí)候,她翻轉(zhuǎn)了皮劃艇,而他卻在游泳。程序員們,請(qǐng)記住:解決問(wèn)題的最佳方式是依靠簡(jiǎn)單性和技巧,而不是蠻力。

            Pet Store:一個(gè)反例

            Pet Store J2EE應(yīng)用程序是一個(gè)很糟糕的編程例子。它誤導(dǎo)成千上萬(wàn)名J2EE開(kāi)發(fā)人員構(gòu)建出設(shè)計(jì)糟糕、性能低下的代碼。它還是一個(gè)基準(zhǔn)的爭(zhēng)論焦點(diǎn)。Middleware Company致力于制訂比較J2EE和微軟的。NET平臺(tái)的基準(zhǔn)。他們選擇Pet Store的J2EE版本作為基準(zhǔn)的基礎(chǔ)。盡管他們很努力地調(diào)優(yōu),J2EE版本還是慘敗給Microsoft .NET版本,因此導(dǎo)致J2EE設(shè)計(jì)備受批評(píng)。我不想針對(duì)這次慘敗譴責(zé)什么。我有不同的看法。我堅(jiān)持認(rèn)為:利用J2EE(尤其是EJB)很難開(kāi)發(fā)出整潔、高性能的代碼。另一方面,Pet Store基準(zhǔn)本身就會(huì)導(dǎo)致更大的問(wèn)題。

            基準(zhǔn)紛爭(zhēng)過(guò)后,很多人借助于更平易且更簡(jiǎn)單的技術(shù)來(lái)實(shí)現(xiàn)Pet Store.其中一種最強(qiáng)大且最簡(jiǎn)單的實(shí)現(xiàn)方法是Clinton Begin所使用的,他利用一個(gè)稱為iBatis的DAO框架來(lái)代替全部的實(shí)體bean.Rod Johnson的團(tuán)隊(duì)將該應(yīng)用程序轉(zhuǎn)化為Spring,并且現(xiàn)在已經(jīng)與Spring框架一起發(fā)布。以下是相關(guān)的一些細(xì)節(jié):

            Spring jPetStore應(yīng)用程序包含在M4或更高版本的Spring中。
            它是一種具有JDBC DAO層的數(shù)據(jù)驅(qū)動(dòng)的應(yīng)用程序。
            它提供了Strut的替代前端以及Spring MVC框架。
            它提供了兩種不同的模型。最簡(jiǎn)單的模型使用單一數(shù)據(jù)庫(kù)和簡(jiǎn)單JDBC事務(wù)。另一種模型可以跨多個(gè)數(shù)據(jù)庫(kù)使用JTA事務(wù)管理。

            在下面的部分中,我將演示具有MVC web前端和單個(gè)數(shù)據(jù)庫(kù)中的簡(jiǎn)單事務(wù)的應(yīng)用程序版本。我將重點(diǎn)討論域模型、單數(shù)據(jù)庫(kù)DAO層、單一事務(wù)以及Spring MVC前端。Spring網(wǎng)站上提供了大量的資源,可供希望深入研究的開(kāi)發(fā)人員使用。

            配置文件

            了解Spring應(yīng)用程序應(yīng)當(dāng)從配置文件開(kāi)始,它顯示了主要的bean以及應(yīng)用程序如何將它們組合在一起。Spring配置文件在應(yīng)用程序上下文中定義bean.將上下文看作是收集應(yīng)用程序指定資源的一種便利方式。

            很多J2EE應(yīng)用程序借助單元素來(lái)了解諸如連接之類的應(yīng)用程序資源。這種用途的單元素與很多Java開(kāi)發(fā)人員經(jīng)常使用的全局變量差別不大。J2EE中的替代方案是一種稱為JNDI的目錄服務(wù),但是對(duì)于許多常見(jiàn)用例來(lái)說(shuō)它就是殺雞的牛刀了。而Spring使用一種應(yīng)用程序上下文。最初,需要在一個(gè)簡(jiǎn)單的XML文件中指定應(yīng)用程序上下文,盡管也可以通過(guò)擴(kuò)展Spring來(lái)接受其它類型的配置文件。以下是應(yīng)用程序上下文中可能會(huì)包含的內(nèi)容:

            數(shù)據(jù)源

            管理連接的Java類,通常在一個(gè)池中。

            DAO層

            如果應(yīng)用程序使用了數(shù)據(jù)庫(kù),那么很可能需要隔離對(duì)DAO層數(shù)據(jù)庫(kù)的訪問(wèn)。可以通過(guò)應(yīng)用程序上下文來(lái)訪問(wèn)該層。

            持久性管理器

            每個(gè)持久性框架都有一個(gè)應(yīng)用程序用來(lái)訪問(wèn)其特性的對(duì)象或工廠。對(duì)于Hibernate來(lái)說(shuō),它就是會(huì)話和會(huì)話工廠。而對(duì)于JDO來(lái)說(shuō),它就是持久性管理器工廠和持久性管理器。

            事務(wù)策略

            可以顯式地聲明希望在事務(wù)中使用的方法以及用于實(shí)施該策略的事務(wù)管理器。

            事務(wù)管理器

            J2EE中有很多不同的事務(wù)管理策略。對(duì)于單一數(shù)據(jù)庫(kù)的應(yīng)用程序,Spring允許使用數(shù)據(jù)庫(kù)的事務(wù)管理。對(duì)于多個(gè)數(shù)據(jù)庫(kù)或事務(wù)源,Spring允許使用JTA.可以將事務(wù)管理器保存在應(yīng)用程序上下文中。

            驗(yàn)證邏輯

            Spring框架使用一種與Strut類似的驗(yàn)證框架。Spring允許像配置其他業(yè)務(wù)組件那樣配置驗(yàn)證邏輯。

            視圖和控制器

            Spring框架允許為視圖指定控制器,并幫助用戶通過(guò)控制器來(lái)配置導(dǎo)航路徑。

            jPetStore應(yīng)用程序使用包含一個(gè)數(shù)據(jù)源、DAO層和一種事務(wù)邏輯的Spring應(yīng)用程序上下文。用戶定義XML文檔中上下文的內(nèi)容,該XML文檔列出了一系列bean.每一個(gè)XML配置文件都包含一個(gè)題頭,其后是一系列組件和一個(gè)腳注。  以上是構(gòu)成應(yīng)用程序上下文的bean。它們代表應(yīng)用程序中的頂級(jí)bean。(它們可以創(chuàng)建不出現(xiàn)在配置文件中的其他對(duì)象或bean。)在本例中,我們會(huì)創(chuàng)建兩個(gè)bean:MyFirstBean和MySecondBean。然后,通過(guò)指定MySecondBean作為字段myField的值,將它們關(guān)聯(lián)起來(lái)。當(dāng)Spring啟動(dòng)的時(shí)候,它會(huì)創(chuàng)建兩種對(duì)象,并設(shè)置myField的值。當(dāng)在應(yīng)用程序上下文中需要它們的時(shí)候,可以根據(jù)名稱來(lái)訪問(wèn)這兩種對(duì)象。

            我們來(lái)看一個(gè)更具體的實(shí)例。jPetStore應(yīng)用程序?yàn)闃I(yè)務(wù)邏輯、數(shù)據(jù)層和用戶界面提供了三種配置文件,每種Spring配置文件各自描述三者之一,如圖8-2所示。


          圖8-2 jPetStore應(yīng)用程序提供了分別與三個(gè)不同的層相匹配的Spring應(yīng)用程序上下文

          posted on 2006-07-13 22:51 溫柔一刀 閱讀(272) 評(píng)論(0)  編輯  收藏 所屬分類: 開(kāi)源框架
          聯(lián)系偶 zhupanjava@gmail.com 溫柔一刀
          主站蜘蛛池模板: 安达市| 晋江市| 高要市| 庄河市| 喜德县| 长沙县| 当阳市| 孟连| 定襄县| 弥渡县| 安溪县| 鹤壁市| 吴川市| 青河县| 左云县| 万安县| 盐山县| 新巴尔虎左旗| 定边县| 大埔区| 台北市| 乌鲁木齐市| 东台市| 涞水县| 昌图县| 峨山| 揭西县| 玉环县| 稷山县| 佛山市| 肥乡县| 柳江县| 平谷区| 衡东县| 香港| 石家庄市| 遂宁市| 伊宁县| 杭锦后旗| 原阳县| 威海市|