Spring也得益于內(nèi)在的一致性。
所有的開發(fā)者都在唱同樣的的贊歌,基礎(chǔ)想法依然是Expert One-on-One Java EE設(shè)計(jì)與開發(fā)的那些。
并且我們已經(jīng)能夠使用一些主要的概念,例如倒置控制,來(lái)處理多個(gè)領(lǐng)域。
Spring在應(yīng)用服務(wù)器之間是可移植的。
當(dāng)然保證可移植性總是一次挑戰(zhàn),但是我們避免任何特定平臺(tái)或非標(biāo)準(zhǔn)化,并且支持在WebLogic,Tomcat,Resin,JBoss,WebSphere和其他的應(yīng)用服務(wù)器上的用戶。
Spring的核心即是個(gè)IoC/DI的容器,它可以幫程序設(shè)計(jì)人員完成組件之間的依賴關(guān)系注入,使得組件之間的依賴達(dá)到最小,進(jìn)而提高組件的重用性,Spring是個(gè)低侵入性(invasive)的框架,Spring中的組件并不會(huì)意識(shí)到它正置身于Spring中,這使得組件可以輕易的從框架中脫離,而幾乎不用任何的修改,反過(guò)來(lái)說(shuō),組件也可以簡(jiǎn)單的方式加入至框架中,使得組件甚至框架的整合變得容易。
Spring最為人重視的另一方面是支持AOP(Aspect-Oriented Programming),然而AOP框架只是Spring支持的一個(gè)子框架,說(shuō)Spring框架是AOP框架并不是一件適當(dāng)?shù)拿枋?,人們?duì)于新奇的 AOP關(guān)注映射至Spring上,使得人們對(duì)于Spring的關(guān)注集中在它的AOP框架上,雖然有所誤解,但也突顯了Spring的另一個(gè)令人關(guān)注的特色。
Spring也提供MVC Web框架的解決方案,但您也可以將自己所熟悉的MVC Web框架與Spring解合,像是Struts、Webwork等等,都可以與Spring整合而成為進(jìn)用于自己的解決方案。Spring也提供其它方面的整合,像是持久層的整合如JDBC、O/R Mapping工具(Hibernate、iBATIS)、事務(wù)處理等等,Spring作了對(duì)多方面整合的努力,故說(shuō)Spring是個(gè)全方位的應(yīng)用程序框架。
Hibernate
Hibernate是一個(gè)開放源代碼的對(duì)象關(guān)系映射框架,它對(duì)JDBC進(jìn)行了輕量級(jí)的對(duì)象封裝,使得Java程序員可以使用對(duì)象編程思維來(lái)操縱數(shù)據(jù)庫(kù)。Hibernate可以在應(yīng)用EJB的Java EE架構(gòu)中取代CMP,完成數(shù)據(jù)持久化。它還可以應(yīng)用在任何使用JDBC的場(chǎng)合,既可以在Java的客戶端程序?qū)嵱?,也可以在Servlet/JSP的Web應(yīng)用中使用
Hibernate的工作方式
Hibernate不會(huì)對(duì)您造成妨礙,也不會(huì)強(qiáng)迫您修改對(duì)象的行為方式。它們不需要實(shí)現(xiàn)任何不可思議的接口以便能夠持續(xù)存在。惟一需要做的就是創(chuàng)建一份 XML“映射文檔”,告訴Hibernate您希望能夠保存在數(shù)據(jù)庫(kù)中的類,以及它們?nèi)绾侮P(guān)聯(lián)到該數(shù)據(jù)庫(kù)中的表和列,然后就可以要求它以對(duì)象的形式獲取數(shù)據(jù),或者把對(duì)象保存為數(shù)據(jù)。與其他解決方案相比,它幾乎已經(jīng)很完美了。
由于本文只是一篇介紹性的文章,所以不會(huì)引入構(gòu)建和使用Hibernate映射文檔的具體例子(我在《Hibernate: A Developer's Notebook》一書的頭幾章中已經(jīng)介紹了一個(gè)例子)。此外,在網(wǎng)上和Hibernate的在線文檔中,還可以找到一些不錯(cuò)的例子,請(qǐng)參見下面的“其他信息”部分。它實(shí)際上相當(dāng)直觀。應(yīng)用程序?qū)ο笾械膶傩砸砸环N簡(jiǎn)單而自然的方式與正確的數(shù)據(jù)庫(kù)結(jié)構(gòu)相關(guān)聯(lián)。
運(yùn)行時(shí),Hibernate讀取映射文檔,然后動(dòng)態(tài)構(gòu)建Java類,以便管理數(shù)據(jù)庫(kù)與Java之間的轉(zhuǎn)換。在 Hibernate中有一個(gè)簡(jiǎn)單而直觀的API,用于對(duì)數(shù)據(jù)庫(kù)所表示的對(duì)象執(zhí)行查詢。要修改這些對(duì)象,(一般情況下)只需在程序中與它們進(jìn)行交互,然后告訴Hibernate保存修改即可。類似地,創(chuàng)建新對(duì)象也很簡(jiǎn)單;只需以常規(guī)方式創(chuàng)建它們,然后告訴Hibernate有關(guān)它們的信息,這樣就能在數(shù)據(jù)庫(kù)中保存它們。
Hibernate API學(xué)習(xí)起來(lái)很簡(jiǎn)單,而且它與程序流的交互相當(dāng)自然。在適當(dāng)?shù)奈恢谜{(diào)用它,就可以達(dá)成目的。它帶來(lái)了很多自動(dòng)化和代碼節(jié)省方面的好處,所以花一點(diǎn)時(shí)間學(xué)習(xí)它是值得的。而且還可以獲得另一個(gè)好處,即代碼不用關(guān)心要使用的數(shù)據(jù)庫(kù)種類(否則的話甚至必須知道)。我所在的公司就曾有過(guò)在開發(fā)過(guò)程后期被迫更換數(shù)據(jù)庫(kù)廠商的經(jīng)歷。這會(huì)造成巨大的災(zāi)難,但是借助于Hibernate,只需要簡(jiǎn)單地修改Hibernate配置文件即可。
這里的討論假定您已經(jīng)通過(guò)創(chuàng)建Hibernate映射文檔,建立了一個(gè)關(guān)系數(shù)據(jù)庫(kù),并且擁有要映射的Java 類。有一個(gè)Hibernate“工具集”可在編譯時(shí)使用,以支持不同的工作流。例如,如果您已經(jīng)擁有Java類和映射文檔,Hibernate可以為您創(chuàng)建(或更新)必需的數(shù)據(jù)庫(kù)表?;蛘撸瑑H僅從映射文檔開始,Hibernate也能夠生成數(shù)據(jù)類?;蛘?,它可以反向設(shè)計(jì)您的數(shù)據(jù)庫(kù)和類,從而擬定映射文檔。還有一些用于Eclipse的alpha 插件,它們可以在IDE中提供智能的編輯支持以及對(duì)這些工具的圖形訪問(wèn)。
使用Hibernate的場(chǎng)合
既然Hibernate看起來(lái)如此靈活好用,為什么還要使用其他的工具呢?下面有一些場(chǎng)景,可以幫助您做出判斷(或許通過(guò)提供一些比較和上下文,可以有助于鑒別非常適用Hibernate的場(chǎng)合)。
如果應(yīng)用對(duì)于數(shù)據(jù)存儲(chǔ)的需要十分簡(jiǎn)單——例如,您只想管理一組用戶優(yōu)先選擇——您根本不需要數(shù)據(jù)庫(kù),更不用說(shuō)一個(gè)優(yōu)秀的對(duì)象-關(guān)系映射系統(tǒng)了(即使它也如Hibernate這般易于使用)!從Java 1.4開始,有一個(gè)標(biāo)準(zhǔn)的Java Preferences API可以很好地發(fā)揮這個(gè)作用。
對(duì)于熟悉使用關(guān)系數(shù)據(jù)庫(kù)和了解如何執(zhí)行完美的SQL查詢與企業(yè)數(shù)據(jù)庫(kù)交互的人來(lái)說(shuō),Hibernate似乎有些礙手礙腳,這就像帶有動(dòng)力和自動(dòng)排擋的快艇車會(huì)使注重性能的賽車駕駛員不耐煩一樣。如果您屬于這種人,如果您所在的項(xiàng)目團(tuán)隊(duì)擁有一個(gè)強(qiáng)大的DBA,或者有一些存儲(chǔ)過(guò)程要處理,您可能想研究一下iBATIS。Hibernate的創(chuàng)建者本身就把iBATIS當(dāng)作是另一種有趣的選擇。我對(duì)它很有興趣,因?yàn)槲覀冊(cè)鵀橐粋€(gè)電子商務(wù)站點(diǎn)開發(fā)了一個(gè)類似的系統(tǒng)(其功能更為強(qiáng)大),而且從那時(shí)到現(xiàn)在,我們已經(jīng)在其他環(huán)境中使用過(guò)它,盡管在發(fā)現(xiàn)Hibernate之后,在新項(xiàng)目中我們通常更喜歡使用Hibernate。您可以認(rèn)為,以SQL為中心的解決方案(比如iBATIS)是“反向的”對(duì)象/關(guān)系映射工具,而 Hibernate是一個(gè)更為傳統(tǒng)的ORM。
當(dāng)然,還有其他的外部原因會(huì)導(dǎo)致采用另外的方法。比如,在一個(gè)企業(yè)環(huán)境中,必須使用成熟的EJB架構(gòu)(或者其他的一些非普通對(duì)象映射系統(tǒng))。可以為提供自己的數(shù)據(jù)存儲(chǔ)工具的平臺(tái)量身定做代碼,比如Mac OS X's Core Data。使用的可能是像XML DTD這樣的存儲(chǔ)規(guī)范,而它根本不涉及關(guān)系數(shù)據(jù)庫(kù)。
但是,如果您使用的是富對(duì)象模型,而且想要靈活、輕松且高效地保存它(無(wú)論您是否正要開始或已經(jīng)決定使用關(guān)系數(shù)據(jù)庫(kù),只要這是一個(gè)選擇——而且存在可用的優(yōu)秀免費(fèi)數(shù)據(jù)庫(kù),比如MySQL,或可嵌入Java的HSQLDB,它就應(yīng)該始終是一個(gè)選擇),那么 Hibernate很可能就是您理想的選擇。您可能會(huì)驚訝于節(jié)省的時(shí)間之多,以及您將會(huì)多么地喜歡使用它。
Swing
圖形用戶接口(GUI)庫(kù)最初的設(shè)計(jì)目的是讓程序員構(gòu)建一個(gè)通用的GUI,使其在所有的平臺(tái)上都能夠正常的顯示。但是比較遺憾的是AWT產(chǎn)生的是在各系統(tǒng)看來(lái)都同樣欠佳的圖形用戶接口,JAVA1.2為老的java1.0 AWT添加了Java基礎(chǔ)類(JFC),這是一個(gè)被稱為“Swing”的GUI的一部分。Swing是第二代GUI開發(fā)工具集,AWT采用了與特定平臺(tái)相關(guān)的實(shí)現(xiàn),而絕大部分Swing組件卻不是。Swing是構(gòu)筑在AWT上層的一組GUI組件的集合,為了保證可移植性,它完全用Java語(yǔ)言編寫,與AWT相比,Swing提供了更完整的組件,引入了許多新的特性和能力。Swing提供了更多的組件庫(kù),如:JTable,JTree,Jcombox。Swing也增強(qiáng)了AWT中組件的功能。正是因?yàn)镾wing具備了如此多的優(yōu)勢(shì)所以我們以后在開發(fā)中都使用Swing。JComponent類是Swing組件的基類,而JComponent繼承自Container類,因此,所有的Swing組件都是AWT的容器。Swing采用了MVC設(shè)計(jì)模式。