|
輕量級(jí)容器可以動(dòng)態(tài)地使系統(tǒng)主要組件之間的耦合變松散。不同的容器包含相同的設(shè)計(jì)模式,但卻具有根本不同的哲學(xué)。本文幫助您在下列三種輕量級(jí)容器之間作出最佳選擇:Spring Framework、HiveMind 和 PicoContainer。 2002 年在科羅拉多的一次旅行中,我完美地感受了阿肯色河。在三段不同的漂流中,這條河展示了令人驚異的多樣性。柔美的布朗峽谷有著開闊的急流,翻滾著巨大的波浪。Royal Gorge 別具特色的懸崖峭壁引導(dǎo)著巨大而筆直的峽谷之下的水力,在這條直線上發(fā)生一點(diǎn)小閃失都會(huì)受到長途游泳的懲罰。Numbers 具有精密的落差,需要人們在范圍狹窄的圓石花園里精確操縱。在一條河里,我有了三次極不相同的體驗(yàn)。 在我的上一篇文章“輕量級(jí)開發(fā)的成功秘訣,第 3 部分:Spring 露出水面”中,我們學(xué)習(xí)了輕量級(jí)容器的基本原理。本文將向您展示三種最流行的容器:
這三種容器都源于依賴注入,但每種容器都具有極不相同的特征。當(dāng)我介紹每種容器的高級(jí)描述時(shí),您將看到正在運(yùn)行的每種框架,以及可以應(yīng)用每種框架的環(huán)境。 這三種容器都接受 POJO (plain old Java object),都具有對(duì)象生命周期的鉤子(所以它們可以在創(chuàng)建或銷毀 bean 時(shí)調(diào)用您的代碼),都執(zhí)行依賴注入。您可能認(rèn)為這些主旋律將導(dǎo)致相似的容器,但事實(shí)并非如此。盡管植入每種容器的代碼可能相似,但容器本身反映了不同的能力、風(fēng)格和整體哲學(xué)??偠灾糠N容器的作者都忠于他們的哲學(xué)。 作為開放源碼框架的 Geneva,Spring Framework 為數(shù)百個(gè) Java 2 Platform, Enterprise Edition (J2EE) API 和開放源碼框架提供了輕量級(jí)容器和膠水代碼 (glue code)。Spring 有一個(gè)最重要的前景:讓 J2EE 更易使用。讀完一些示例和書籍之后,您將看到一些常見的主題:
如果要用一個(gè)短語來形容 Spring,我會(huì)說讓企業(yè)更強(qiáng)。 Howard Lewis Ship 是 Jakarta Tapestry Web 框架的創(chuàng)建者,他還創(chuàng)建了 HiveMind。作為一個(gè)容器,HiveMind 是靈巧、干凈且易于使用的。與其他許多較好的開放源碼框架一樣,Ship 創(chuàng)建 HiveMind 是為了讓它幫助解決現(xiàn)實(shí)問題。但是,HiveMind 向傳統(tǒng)的輕量級(jí)容器添加了兩個(gè)創(chuàng)新:
如果用一個(gè)短語來形容 HiveMind 的話,我會(huì)說它是概念正確 的。 到目前為止,PicoContainer 最重要的特征是它的尺寸。它沒有提供許多附加物,但它具有完整的依賴注入容器。PicoContainer 還具有一些惟一特性:
如果用一個(gè)短語來形容 PicoContainer 的話,我會(huì)選擇理論完美,但不如 Spring 或 HiveMind 實(shí)用。
現(xiàn)在我將向您展示社區(qū)中流行的編程示例,以幫助您更好地理解容器的作者希望您如何使用它們。我使用 PicoContainer 中的 Kiss 示例來展示 autowiring 和 Java 技術(shù)風(fēng)格的配置,使用 HiveMind 加法器示例來展示模塊能力,使用 Spring PetClinic 應(yīng)用程序來展示 Hibernate 集成。 在這三個(gè)容器中,PicoContainer 具有最簡單的編程模型。要查看 Kiss 示例,可從 PicoContainer.org 下載它。安裝該示例,瀏覽到 docs\Two+minute+tutorial.htm,然后您會(huì)看到兩個(gè)組件: 清單 1. 兩個(gè) Kiss 組件
這兩個(gè)類是自解釋的。Girl 對(duì) Boy 有依賴關(guān)系。該依賴關(guān)系將通過構(gòu)造函數(shù)被注入。先實(shí)例化一個(gè)容器:
然后注冊兩個(gè)組件:
稍后您可以向 PicoContainer 請(qǐng)求一個(gè)對(duì)象,然后操作它:
這樣就差不多了。編程模型是優(yōu)雅的,基于構(gòu)造函數(shù)的風(fēng)格意味著您無需包括無參構(gòu)造函數(shù)。對(duì)本例中的 Girl 調(diào)用這種函數(shù)將會(huì)使該對(duì)象處于不一致的狀態(tài),因?yàn)? 現(xiàn)在,讓我們看一下 HiveMind 的編程示例。從 Apache Jakarta Project 下載 HiveMind,然后查看加法器示例。您會(huì)看到接口和實(shí)現(xiàn)。(記住:HiveMind 強(qiáng)制編寫接口。) 清單 2. 加法器示例接口和實(shí)現(xiàn)
將該服務(wù)暴露在 XML 文件中,如下所示: 清單 3. 將該服務(wù)暴露在 XML 文件中
然后,其他應(yīng)用程序就可以使用該服務(wù)了,如下所示: 清單 4. 其他應(yīng)用程序可以使用該服務(wù)
注意,HiveMind 的模塊讓您可以將多個(gè)服務(wù)組合到一起。如果您需要向容器中的服務(wù)添加功能,可以使用攔截器: 清單 5. 使用攔截器添加功能
Spring 處理事情的方法有些不同。因?yàn)?Spring 框架不帶有簡單的應(yīng)用程序,我從我的書籍 Spring: A Developer‘s Notebook 中選擇了一個(gè)。您可以從 O‘Reilly Media 獲取該示例代碼。解壓示例 4,它展示了一個(gè)用于 RentaBike 商店的帶有屬性的 清單 6. CommandLineView 對(duì)象
RentaBike 是具有您希望在自行車商店對(duì)象中看到的各種方法的接口: 清單 7. 接口方法
沒有顯示 清單 8. 描述應(yīng)用程序 bean 的 XML 配置文件
該上下文中有兩個(gè) bean。
既然已經(jīng)看到每種容器的哲學(xué),下面是對(duì)每種環(huán)境的無形特性的詳細(xì)比較,比如市場份額、整體質(zhì)量(fit and finish)和整體特性列表。畢竟,即使編程模型是完美的,但如果沒有文檔,或者由于缺乏社區(qū)而您必須自己支持它,那么它也不會(huì)成為一個(gè)好容器。 Spring 有一個(gè)充滿活力的社區(qū),和一個(gè)支持該框架的稱為 Interface21 的職業(yè)服務(wù)公司。這很重要,因?yàn)槟滥梢垣@得良好的支持,公司才有動(dòng)力來支持 Spring 框架。我在社區(qū)的經(jīng)歷簡直太美好了。Spring 貢獻(xiàn)者、創(chuàng)始人和用戶都以杰出的內(nèi)容填滿了留言板。 HiveMind 框架是一個(gè) Apache Jakarta 項(xiàng)目,所以有著扎實(shí)的基礎(chǔ)。它有一個(gè)正在成長的萌芽社區(qū)。該框架的創(chuàng)始人 Howard Lewis Ship 是獨(dú)立顧問、優(yōu)秀導(dǎo)師和不屈不撓的提倡者。但是,要利用 HiveMind 的質(zhì)量幫助或者查找其 Web 站點(diǎn)之外的內(nèi)容仍然十分困難。盡管如此,它的在線幫助似乎不錯(cuò),而且社區(qū)似乎正在成長。Hibernate 獲得了有趣的勝利,它被選中——或者更應(yīng)該說,Ship 被選中——組成 TheServerSide.com 的新基礎(chǔ)設(shè)施,TheServerSide.com 是最重要的 Java 技術(shù)社區(qū)之一。 PicoContainer 也是一個(gè) Apache Jakarta 項(xiàng)目,它似乎發(fā)展緩慢。截止本文撰稿,PicoContainer 的最后一次主要代碼發(fā)行是在 2004 年 11 月。您看不到太多有關(guān) PicoContainer 的新文章,這有點(diǎn)慚愧,因?yàn)槲蚁矚g PicoContainer 的一些哲學(xué)。事實(shí)上,我不太確定有沒有三種開放源碼輕量級(jí)容器的空間,尤其是最近第四種輕量級(jí)容器項(xiàng)目 Avalon 關(guān)閉之后。 就每個(gè)社區(qū)生成的活動(dòng)而言,Spring 無疑是優(yōu)勝者。Interface21 的支持、奇思妙想的論壇、活躍的郵件列表以及社區(qū)的跟蹤記錄都是無與倫比的。 社區(qū)的大小和實(shí)力通常驅(qū)動(dòng)開放源碼項(xiàng)目的整體質(zhì)量。充滿活力的社區(qū)需要更好的文檔和示例,而且它們會(huì)參與完成結(jié)尾的詳細(xì)信息。 Spring 團(tuán)隊(duì)編寫了可與我見過的一些比較好的商業(yè)產(chǎn)品相媲美的文檔。如果這還不夠的話,您還可以找到至少五本主要 Spring 書籍和其他許多包含 Spring 內(nèi)容的出版物。(我自己曾撰寫過兩本有關(guān) Spring 的書籍,其中一本書中包括 Jolt-winning Better, Faster, Lighter Java 一章,另一本是快速入門書籍 Spring: A Developer‘s Notebook)。錯(cuò)誤消息是專業(yè)性和描述性的。與第三方框架和 API 的集成是所有 Java 技術(shù)框架中最好的。包裝是經(jīng)過深思熟慮的,不過略有多余。(它幫助我開始把一些比較小的項(xiàng)目劃分成模塊。)示例是優(yōu)秀且有指導(dǎo)意義的。 與 Tapestry 一樣,HiveMind 也具有好的整體質(zhì)量。Ship 自己以那些讓 HiveMind 變得簡單易用的特性而自豪,比如行準(zhǔn)確的錯(cuò)誤報(bào)告;友好簡明的 XML 語法;良好的文檔工具 HiveDoc。與用于低級(jí)詳細(xì)信息的 JavaDoc 文檔結(jié)合使用,您可以更好地描述您的應(yīng)用程序(HiveMind 模塊)的高級(jí)特性,從而完善它們之間的依賴關(guān)系。 PicoContainer 編程模型感覺自然,但文檔不完整(許多方法標(biāo)記看起來過時(shí)好幾個(gè)月了),而且沒有許多使用該容器的真實(shí)世界示例。有時(shí)候,我會(huì)覺得自己在獨(dú)自穿過鬼魂出沒的破屋。 但使用 PicoContainer 確實(shí)有一個(gè)主要優(yōu)點(diǎn)。因?yàn)槟渲矛F(xiàn)實(shí)世界的對(duì)象時(shí),會(huì)得到一些編譯時(shí)錯(cuò)誤檢查。實(shí)際上,該容器太小太輕了,以至于除了基本配置之外,沒有什么能出錯(cuò)。PicoContainer 做了一項(xiàng)合理的工作。 我不想過多地討論特性。如果您正在尋找許多膠水代碼來減少您的開放源碼收藏夾的集成或某特定 J2EE API,Spring 無疑是最佳選擇。HiveMind 不嘗試參與競爭。相反,它與 Spring 的服務(wù)兼容。PicoContainer 不構(gòu)建而且也不嘗試構(gòu)建附加物,而是選擇讓開放源碼項(xiàng)目為其提供服務(wù)。到目前為止,它的效果不太好。
目前,只有一個(gè)真正的答案。HiveMind 具有有趣的創(chuàng)新,PicoContainer 具有易于使用的模型(理論上),但社區(qū)似乎已經(jīng)投票選擇了 Spring Framework。隨著時(shí)間的推移,新的容器可能會(huì)成長,HiveMind 可能不斷獲得市場份額,但目前,Spring 是您的最佳選擇。 如果您愿意冒一些險(xiǎn),而使用不太成熟或不太流行的容器,您可能決定實(shí)現(xiàn) HiveMind(如果需要模塊級(jí)別的配置)或 PicoContainer(如果想要微小的容器)。如果需要許多膠水代碼來集成持久引擎、事務(wù)處理策略和安全性等方面,Spring 具有最完整的組件堆。但請(qǐng)記?。耗梢栽?HiveMind 容器中使用 Spring 組件。 學(xué)習(xí)
|
|||||||||||||||||||||||||||
|
|