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