您的位置:軟件測(cè)試 > 開(kāi)源軟件測(cè)試 > 開(kāi)源功能測(cè)試工具 >
Spring Framework基礎(chǔ)知識(shí)
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2013/1/6 15:30:25 ] 推薦標(biāo)簽:

實(shí)體關(guān)系映射(O/R mapping, ORM)集成

當(dāng)然你經(jīng)常需要使用實(shí)體關(guān)系映射,而不是使用關(guān)系型數(shù)據(jù)訪(fǎng)問(wèn)。你的整體應(yīng)用程序框架也必須支持這個(gè)。因而Spring繼承了Hibernate(版本2 和3)、JDO(版本1 和2)、TopLink和其他ORM產(chǎn)品。他的數(shù)據(jù)訪(fǎng)問(wèn)架構(gòu)允許與任何底層數(shù)據(jù)訪(fǎng)問(wèn)技術(shù)集成。Spring和Hibernate是一個(gè)相當(dāng)流行的組合。

為什么你要用一個(gè)ORM產(chǎn)品加上Spring,而不是直接使用它呢?Spring在以下方面增加了重要價(jià)值:

    會(huì)話(huà)管理。Spring提供了對(duì)諸如Hibernate或Toplink 會(huì)話(huà)的有效、簡(jiǎn)單而且安全的處理。相關(guān)的單獨(dú)使用ORM工具的代碼通常需要使用同一個(gè)“Session”對(duì)象來(lái)達(dá)到有效且合的事務(wù)處理。Spring能使用一個(gè)聲明性的AOP方法攔截器或使用顯式的Java 代碼級(jí)的“模板”封裝類(lèi)來(lái)透明創(chuàng)建一個(gè)會(huì)話(huà)并將其綁定到當(dāng)前線(xiàn)程。因而Spring解決了許多影響ORM 技術(shù)用戶(hù)的使用問(wèn)題。
    資源管理。Spring應(yīng)用程序上下文能處理Hibernate SessionFactory、JDBC數(shù)據(jù)源和其他相關(guān)資源的定位和配置。這使得這些值易于管理和更改。
    完整的事務(wù)管理。Spring允許你將你的ORM代碼封裝為一個(gè)聲明性的AOP方法攔截器或者一個(gè)顯式的Java 代碼級(jí)的“模板”封裝類(lèi)。不管哪種情況,事務(wù)語(yǔ)義都為你處理了,并且在異常發(fā)生時(shí)也作了恰當(dāng)?shù)氖聞?wù)處理(回滾等)。正如我們后面討論的,你也可以使用并切換不同事務(wù)管理器而不影響你的ORM相關(guān)代碼,并從中獲益。一個(gè)額外的好處是為了支持大多數(shù)ORM工具JDBC相關(guān)代碼能完全事務(wù)性地與ORM代碼集成。這對(duì)于處理ORM沒(méi)有實(shí)現(xiàn)的功能時(shí)很有用。
    如上所述的異常封裝。Spring能封裝來(lái)自O(shè)RM層的異常,將它們從私有(可能是經(jīng)過(guò)檢查的)異常轉(zhuǎn)換為一組抽象的運(yùn)行時(shí)異常。這允許你可以不用煩人的樣板化的catch/throw和異常聲明仍能在恰當(dāng)?shù)膶又刑幚泶蠖鄶?shù)不可恢復(fù)的持久化異常。你仍能在任何需要的地方捕獲和處理異常。請(qǐng)記住JDBC異常(包括數(shù)據(jù)庫(kù)特有方言)也被轉(zhuǎn)換為相同層次,這意味著你能在一致的編程模型內(nèi)用JDBC執(zhí)行一些操作。
    避免和廠(chǎng)商綁定。ORM解決方案有不同的性能和特性,沒(méi)有能滿(mǎn)足所有情況的完美解決方案。作為選擇,你會(huì)發(fā)現(xiàn)某一個(gè)功能正好不匹配你用的ORM工具的一個(gè)實(shí)現(xiàn)。這讓你意識(shí)到你的數(shù)據(jù)訪(fǎng)問(wèn)對(duì)象接口的特定工具實(shí)現(xiàn)對(duì)你的架構(gòu)有影響。一旦你因?yàn)楣δ、性能或其他原因需要切換到另一個(gè)實(shí)現(xiàn),現(xiàn)在使用了Spring讓終的切換變得更容易了。Spring對(duì)你ORM工具的事務(wù)和異常的抽象,和它的IoC方法一起讓你在映射器/DAO 對(duì)象實(shí)現(xiàn)數(shù)據(jù)訪(fǎng)問(wèn)功能間輕松切換,簡(jiǎn)單地實(shí)現(xiàn)將ORM特有代碼控制在你應(yīng)用程序的一個(gè)范圍里而不犧牲你ORM工具的能力。和Spring一起發(fā)布的寵物醫(yī)院范例程序演示了Spring通過(guò)提供使用JDBC、Hibernate、TopLink和Apache OJB實(shí)現(xiàn)的不同持久層而帶來(lái)的可移植性方面的價(jià)值。
    簡(jiǎn)化測(cè)試。Spring的控制反轉(zhuǎn)方法使得切換實(shí)現(xiàn)和諸如Hibernate會(huì)話(huà)工廠(chǎng)、數(shù)據(jù)源、事務(wù)管理器和映射器對(duì)象實(shí)現(xiàn)(如果需要)之類(lèi)的資源位置變得簡(jiǎn)單了。這簡(jiǎn)化了隔離和每部分持久化相關(guān)代碼的單獨(dú)測(cè)試。

綜上所述,Spring讓混用數(shù)據(jù)存取過(guò)程更簡(jiǎn)單了。盡管ORM在很多案例里贏得了頗有價(jià)值的生產(chǎn)力,無(wú)論一些ORM廠(chǎng)商怎么宣稱(chēng),ORM不是所有問(wèn)題的解決方案。即使你混用各種持久化方法,即使你不用JTA,Spring仍能提供一致的架構(gòu)和事務(wù)策略。

在ORM并不理想的地方,Spring的簡(jiǎn)化JDBC并不是選擇:iBATIS SQL Maps 提供的“映射語(yǔ)句”也值得一看。它在保持自動(dòng)從查詢(xún)結(jié)果中創(chuàng)建映射對(duì)象的同時(shí)提供了對(duì)SQL的高層控制。Spring集成了SQL Maps。Spring的寵物店范例程序演示了iBATIS集成。

事務(wù)管理

僅抽象一個(gè)數(shù)據(jù)訪(fǎng)問(wèn)API是不夠的;我們還需要考慮事務(wù)管理。JTA是當(dāng)然的解決方案,但直接使用它的API是很笨重的,因而許多J2EE 開(kāi)發(fā)者曾覺(jué)得EJB CMT是事務(wù)管理的明智的選擇。Spring改變了這一點(diǎn)。

Spring提供了它自己的針對(duì)事務(wù)管理的抽象。Spring 使用它來(lái)提供:

    通過(guò)一個(gè)類(lèi)似JdbcTemplate的回調(diào)模板來(lái)實(shí)現(xiàn)可編程的事務(wù)管理,比起直接使用JTA容易許多。
    類(lèi)似EJB CMT的聲明性事務(wù)管理,但不需要EJB容器。實(shí)際上,正如我們所見(jiàn),Spring的聲明性事務(wù)管理能力是EJB CMT語(yǔ)義上的超集,有些獨(dú)特的重要的好處。

Spring的事務(wù)抽象的獨(dú)特之處在于它不綁定于JTA或其他任何事務(wù)管理技術(shù)。Spring使用事務(wù)策略概念,這減弱了底層事務(wù)基礎(chǔ)部分(例如JDBC)對(duì)應(yīng)用程序代碼的影響。

為什么你需要關(guān)心這個(gè)?JTA不是對(duì)所有事務(wù)管理問(wèn)題的好答案嗎?如果你正在寫(xiě)一個(gè)只與一個(gè)數(shù)據(jù)庫(kù)打交道的應(yīng)用程序,你不需要JTA的復(fù)雜性。你不關(guān)心XA事務(wù)或兩階段提交。你甚至可以不需要一個(gè)提供這些東西的高端應(yīng)用服務(wù)器。但另一方面,你不會(huì)愿意在和多個(gè)數(shù)據(jù)源打交道時(shí)重寫(xiě)你的代碼。

軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd