OSGi 作為事實上的工業標準,其面向服務(介面)的核心思想與動態模塊部署能力,是企業級應用長期追求的目標。Spring 以面向介面編程與非侵入式依賴注入聞名。兩者結合能充分發揮各自優勢,更好滿足企業級開發需求。Spring 團隊 2008 年發布首個整合版本 Spring-DM。本文通過一個簡單實例,介紹如何利用 Spring-DM 開發基於 OSGi 與 Spring 架構的 Web 應用,並探討關鍵技術與基本思想。
構建一個簡單 Web 頁面 compute.html,計算兩個數字的和或乘積。為體現 OSGi Bundle 動態部署能力,編寫兩個 Service Bundle:add bundle 計算和,multiply bundle 計算積。點擊「Compute」按鈕時,若 add bundle 已部署則返回和,若 multiply bundle 已部署則返回積。


應用包含兩層:服務層與 Web 層。Web 層基於 Spring-MVC,包含處理 Web 訪問的 Bundle(本例僅一個)。服務層包含數字計算 Bundle:一個聲明服務介面的 compute interface bundle,兩個實現介面的 Bundle(add、multiply)。結構如下:

三個 Service Bundle 結構:

com.zxn.example.service.compute:聲明 Compute 介面,含 computeNums() 方法。com.zxn.example.service.compute.add:實現 Add 類,於 META-INF/spring/computeAdd-context.xml 以 <osgi:service> 導出 OSGi Service。com.zxn.example.service.compute.multiply:同理實現 Multiply 類與 computeMultiply-context.xml。




Web Bundle:com.zxn.example.web,採 Spring-MVC + OSGi 構建。

ComputeController.java:實現 Controller,核心 Servlet,處理 Web 請求,調用 ComputeServiceRef 完成業務邏輯,關鍵方法 handleRequest()。ComputeServiceRef.java:引用部署的 Service Bundle 完成計算,computeService 由 Spring 根據 OSGi 實際部署的 Service 動態注入。此處體現 Spring-DM 動態特性:OSGi 動態部署使 Spring 動態服務注入成為可能。HTTPContextRegistry.java:配置註冊 HTTP 服務,init() 方法中用 ServiceTracker 獲取 OSGi 環境中註冊的 HTTP 服務引用。computeWeb-context.xml:配置 HTTPContextRegistry Bean 並用 <osgi:reference> 導入 Compute 服務介面。computeWeb-Dispatcher.xml:配置 ComputeController Bean。





基於 OSGi 的應用可脫離應用伺服器直接在 Eclipse 中調試運行。啟動後同時部署 add 與 multiply bundle,OSGi Console 顯示狀態。OSGi 會選擇一個預設 Bundle 提供服務(本例預設注入 add)。訪問頁面點擊 Compute 返回和。執行 <stop 76> 停止 add bundle,狀態變為 RESOLVED,再次訪問則返回乘積,證明 multiply bundle 接管服務。







OSGi 與 Spring 初步融合,為企業級 Web 應用提供極大靈活性與動態部署能力。本文通過簡單例子描述開發流程並說明關鍵技術點。