我很高興報告(與 Adrian 一起),在經歷了 3 個里程碑和 2 個候選版本之後,Spring Dynamic Modules (以前稱為 Spring OSGi) 1.0 已經發佈。
自從我之前的文章 (關於 1.0 M1) 以來,許多功能都得到了改進或添加;我將在以後的文章中更多地談論它們(還有參考文件,其中詳細解釋了該程式庫),所以我只會提到一些
- 一致性
我們希望提供一個強大、簡單且一致的程式設計模型。 這就是為什麼 Spring Dynamic Modules 建立在 Spring 之上,並使用其經過驗證的概念、可靠性和普遍性。
- 高度非侵入性
使用 Spring DM 的建議方式是不要在您的程式碼中使用其類別,或在您的 bundle 資訊清單中包含對它們的任何匯入。 如果您沒有在程式碼中使用 Spring,而僅將其用於應用程式配置,則同樣的規則適用。 Spring DM 為您建立應用程式上下文,因此您無需依賴 Spring 或 Spring DM。 而且不用擔心諸如自訂命名空間或 XML 結構描述之類的事情 - 我們已經涵蓋了它們。
- OSGi 服務動態生命週期管理
這是 Spring DM 最重要的功能之一 - 能夠像處理普通 bean 一樣與 OSGi 服務互動。 您可以發布和使用 OSGi 服務而無需編寫任何程式碼; 我們將為您處理動態 - 並且您擁有完全的控制權(更多相關資訊將在未來提供)。
- 更智慧的整合測試框架
由於我們在內部廣泛使用了 Spring-DM 整合測試,因此我們改進了預設值、maven 整合,並使自動資訊清單生成比以前更快、更智慧。 例如,該框架會自動確定測試 bundle 中可用的類別,並且不會為其生成匯入。
- 簡單的 bundle 互動
Andy Piper (部落格) 添加了一種簡單、宣告式的方式來根據模組生命週期和 Spring bean 依賴性來安裝/啟動/停止/更新 bundle。
- 受管理的啟動/關閉上下文建立
在 OSGi 中,應用程式被分解為各種模組(也稱為 bundle),這些模組相互依賴服務。 這會在模組之間建立一個依賴關係樹,這在啟動和關閉期間變得非常重要。 傳統上,可以通過基於依賴關係順序安裝和啟動 bundle 來解決這個問題,但是,這並不能完全解決該問題。 正如 OSGi 規範建議的那樣,初始化時間較長的 OSGi 服務(例如連接池)應依賴於與用於啟動和停止 bundle 的線程不同的線程。 這意味著,如果啟動了一個 bundle,並不意味著它的服務已啟動。 而且並非每個應用程式都準備好在啟動期間等待其所需的服務 - 事實上,很少有應用程式這樣做。 這意味著 bundle 將會失敗,因為它依賴於幾毫秒後發布的服務(OSGi 預設情況下是一個內 VM 平台,在這個平台上,事情發生得非常快)。
這種行為並非罕見 - 事實上,它在具有多個 bundle 的多核心平台上啟動時非常常見。 Spring DM 通過確定依賴關係(來自 Spring 配置)並等待它們變得可用,然後再建立應用程式上下文來解決這個問題。 類似的流程將在關閉時使用,屆時 Spring DM 將根據上下文的依賴關係順序停止上下文,因此您無需擔心啟動或停止 bundle。
- 無線程的依賴關係等待
我不能在不提及 Hal Hildebrand 實作的用於依賴關係等待的「無線程」方法(聽起來有點像矛盾修飾法,我知道 - 我們正在為它設計一個花哨的標題)的情況下討論依賴關係機制(請參閱他的 部落格)。 由於各種服務需要可用才能使模組正確啟動,因此需要某種等待/監視,這傳統上意味著使用線程。
但是,在 OSGi 平台上可以(並且將會有)多個模組(很容易達到幾十個)- 為每個模組使用一個等待線程根本無法擴展。 我們努力改進的一件事是這個模型,我相信我們提供了一個非常好的解決方案 - 在等待過程中完全不使用線程。 這意味著,無論部署了 3 個 bundle 還是 300 個,除非您的模組實際啟動,否則都不會花費任何 CPU 時間。
Spring Dynamic Modules 不僅僅是將 API「spring 化」,而是處理不同的運行時環境。
關於工具,Spring IDE 支援 Spring DM 命名空間,並且(感謝 Christian) 還為 Eclipse PDE 提供了 Spring-DM 特定的 targets,這是 Spring IDE 每夜構建版中的可用功能(有關安裝和使用該外掛程式的更多資訊可在參考文件中找到)。
未來方向
既然 1.0 已經發佈,接下來是什麼? 有很多領域需要涵蓋
Web 支援
OSGi 平台提供專用的 Http Service,但使用它需要編碼。 資源載入、JSP 生成和部署等事情可以得到顯著簡化。 這是 1.1 版本的主要關注點。
持久化
現代持久化工具提供高級功能,例如延遲載入,這會彎曲 OSGi 環境強制執行的模組化邊界,因為它們依賴於類別生成和代理。 我們希望解決這個問題,並且就像 web 支援一樣,無論使用普通的 JDBC 或/和 ORM 工具,都能提供流暢的體驗。
AOP
在解決持久化問題之後,我們正在尋找在 OSGi 內部進行通用 AOP 的解決方案。 這是一個難啃的硬骨頭,並且要正確地做到這一點,需要內部 OSGi 平台支援。 好消息是,諸如 Equinox Aspects 之類的專案已經引領了道路,並且 OSGi 企業專家組 (EEG) 正在關注這個問題。
說夠了
如果您想了解更多關於 Spring Dynamic Modules 的資訊,請參閱 專案頁面 和參考文件,並使用我們的郵寄清單(論壇將很快出現)。 此外,最近我們製作了一些 OSGi/Spring DM 螢幕截圖,這些截圖可在 Spring DM 主頁上找到。 第一個(由我製作,由兩部分組成),展示了如何快速建立一個專案來使用 Spring DM 進行整合測試。
為什麼要進行整合測試? 因為使用 Spring DM 進行整合測試是一個非常簡單和快速的過程,並且是了解 OSGi(尤其是在模組化方面)的一種非常有效的方式。
將來會有更多的螢幕截圖 - 只需告訴我們您想看什麼,我們將根據請求的數量對它們進行排隊。
不再贅述,「使用 Spring DM 進行 OSGi 整合測試」
