簡介
OSGi 架構為開發模組化的Live App程式提供了良好的機制,它最近正變得十分流行。最新的 OSGi Service Platform Release 4 V4.2 規範包括了一個名為 Blueprint Container 的規範。
Spring 動態模組
如果熟悉 Spring 架構的話,您將注意到 Spring 和 Blueprint Container 規範之間有許多相似點。 Blueprint 規範的基礎恰好是 Spring Dynamic Modules 項目。
Blueprint Container 規範為 OSGi 定義了一個 依賴性注入(dependency injection)架構。它的目 的是處理 OSGi 的動態特性,即服務可以在任何時間變得可用和不可用。該規範的另一個意圖是處理普通 舊 Java 對象(POJO),這樣相同的對象就可以用於 OSGi 架構的內部和外部。定義並描述應用程式各個 組件的 Blueprint XML 檔案對 Blueprint 編程模型十分重要。規範描述了組件如何被執行個體化,以及如何 相互串連在一起形成一個可以啟動並執行應用程式。
Blueprint Container 規範使用了一個擴充器(extender)模式,藉助這種模式,擴充器包監視架構 中的包的狀態,並根據這些包的狀態為它們執行操作。Blueprint 擴充器包等待包被啟用,然後檢查它們 是否是 Blueprint 包。如果一個包包含一個或多個 Blueprint XML 檔案,那麼它就被認為是 Blueprint 包。這些 XML 檔案位於一個 OSGI-INF/blueprint/ 目錄下的某個固定位置,或者在 Bundle-Blueprint 清單頭部中顯式指定。
一旦擴充器確定某個包是 Blueprint 包後,它將為這個包建立一個 Blueprint Container。這個 Blueprint Container 負責完成以下操作:
解析 Blueprint XML 檔案
執行個體化
將元件連線在一起
在初始化期間,Blueprint Container 確保強制服務引用得到滿足,將所有服務註冊到服務註冊表中 ,然後建立初始的組件執行個體。Blueprint 擴充器包還在包停止後為該包銷毀 Blueprint Container。
本文將關注 Blueprint XML。通過若干樣本展示組件 XML 定義及其使用。
Blueprint XML
Blueprint XML 檔案被標識為頂級 blueprint 元素,如清單 1 所示。
清單 1. Blueprint XML 檔案片段
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns=”http://www.osgi.org/xmlns/blueprint/v1.0.0”>
...
</blueprint>
Blueprint XML 檔案包含各種組件管理器的定義。Blueprint Container 規範定義了四種主要的組件 管理器:一個 bean manager、一個 service manager 和兩個 service reference managers。每種管理 器都負責建立和管理所建立組件的生命週期。管理器提供了一個組件執行個體。每個管理器都擁有相應的 XML 元素,用於描述管理器屬性。管理器可以是頂級管理器,或者內聯在其他管理器定義內。管理器還具有一 些通用的屬性。
id 定義管理器的 ID。id 屬性是可選屬性。如果沒有指定的話,將自動產生一個唯一 ID 並分配給頂 級管理器。內聯管理器被認為是匿名的,因此不允許設定 id 屬性。管理器 ID 在 Blueprint Container 內對於所有頂級管理器必須是唯一的。管理器使用 ID 彼此引用。例如,在注入期間,管理器將要求被引 用的管理器提供對象,該對象將被注入到管理器正在建立的組件中。activation 這個可選屬性為管理器 定義啟用模式。可支援兩種啟用模式:
eager,其中管理器在 Blueprint Container 初始化期間啟用。
lazy,其中管理器按需要啟用。
預設情況下,啟用 eager 啟用模式。然而,通過對 blueprint 元素設定 default-activation 屬性 ,可以為 Blueprint XML 檔案內的所有管理器修改預設啟用模式。當要求管理器提供其第一個組件執行個體 時,管理器將被啟用。當 Blueprint Container 被銷毀時,管理器將被解除啟用。每個管理器都擁有自 己的啟用和解除啟用步驟。dependsOn這個可選屬性指定了一個管理器 ID 列表。所列出的管理器將在其 他管理器之前啟用。管理器可以具有顯式或隱式的依賴關係。dependsOn 屬性定義了顯式的依賴關係。隱 式依賴關係在管理器定義中通過對其他管理器的引用定義。