我很高興地報告(與 Adrian 一起)經過 3 個里程碑版本和 2 個釋出候選版本,Spring Dynamic Modules(以前稱為 Spring OSGi)1.0 版本已經釋出。
自我的上一篇文章(關於 1.0 M1)以來,許多功能得到了改進或新增;我將在未來的文章中詳細討論它們(還有詳細解釋該庫的參考文件),所以這裡只列舉幾個:
- 一致性
我們希望提供一個強大、簡單且一致的程式設計模型。這就是 Spring Dynamic Modules 構建於 Spring 之上並利用其成熟概念、可靠性和普遍性的原因。
- 高度非侵入性
推薦使用 Spring DM 的方法是不要在你的程式碼中使用其類,或在你的 Bundle Manifest 中匯入它們。如果你在程式碼中不使用 Spring,僅用於你的應用程式配置,同樣的規則也適用。Spring DM 為你建立應用程式上下文,因此你無需依賴 Spring 或 Spring DM。而且不必擔心自定義名稱空間或 XML Schema 等問題——我們已經涵蓋了這些。
- OSGi 服務動態生命週期管理
這是 Spring DM 最重要的特性之一——能夠像處理普通 Bean 一樣與 OSGi 服務互動。無需編寫任何程式碼即可釋出和消費 OSGi 服務;我們將為你處理其動態性——你擁有完全的控制權(未來會詳細介紹)。
- 更智慧的整合測試框架
由於我們在內部廣泛使用了 Spring-DM 整合測試,我們改進了預設設定、Maven 整合,並使自動 Manifest 生成比以前更快更智慧。例如,框架會自動確定測試 Bundle 中可用的類,並且不會為其生成匯入。
- 簡單的 Bundle 互動
Andy Piper(部落格)添加了一種簡單、宣告式的方法來根據模組生命週期和 Spring Bean 依賴關係安裝/啟動/停止/更新 Bundle。
- 受管理的啟動/關閉上下文建立
在 OSGi 中,應用程式被分解成各種模組(也稱為 Bundle),它們相互依賴服務。這在模組之間建立了一個依賴樹,這在啟動和關閉期間變得很重要。傳統上可以透過按照依賴順序安裝和啟動 Bundle 來解決這個問題,但這並不能完全解決問題。正如 OSGi 規範所建議的,初始化時間較長的 OSGi 服務(例如連線池)應該依賴於與用於啟動和停止 Bundle 的執行緒不同的執行緒。這意味著如果一個 Bundle 啟動了,並不意味著其服務就可用了。而且並非所有應用程式都準備好在啟動時等待其所需的服務——事實上,很少有應用程式會這樣做。這意味著一個 Bundle 會失敗,因為它依賴於稍後幾毫秒釋出的服務(預設情況下,OSGi 是一個虛擬機器內平臺,事情發生得非常快)。
這種行為並不罕見——事實上,在具有多個 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 特定目標,這是 Spring IDE 每夜構建版本中的一個功能(關於安裝和使用該外掛的更多資訊可以在參考文件中找到)。
未來方向
既然 1.0 已經發布,接下來是什麼?有很多領域需要涵蓋
Web 支援
OSGi 平臺提供了一個專用的Http 服務,但使用它需要編碼。資源載入、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 整合測試”
