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