久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    基于 OSGi 和 Spring 開發(fā) Web 應(yīng)用

     ~水手~!! 2010-12-24

     

    簡介: 作為一個新的事實上的工業(yè)標(biāo)準(zhǔn),OSGi 已經(jīng)受到了廣泛的關(guān)注, 其面向服務(wù)(接口)的基本思想和動態(tài)模塊部署的能力, 是企業(yè)級應(yīng)用長期以來一直追求的目標(biāo)。Spring 是一個著名的 輕量級 J2EE 開發(fā)框架,其特點是面向接口編程和非侵入式的依賴注入。將 OSGi 和 Spring 結(jié)合能充分發(fā)揮二者各自的特長,更好地滿足企業(yè)級應(yīng)用開發(fā)的需求。Spring 開發(fā)組織在 2008 年發(fā)布了將 OSGi 和 Spring 結(jié)合的第一個版本:Spring-DM。本文通過一個簡單實例,介紹如何利用 Spring-DM 開發(fā)基于 OSGi 和 Spring 架構(gòu)的 Web 應(yīng)用,同時探討其中用到的關(guān)鍵技術(shù)及其基本思想。

    發(fā)布日期: 2009 年 2 月 26 日
    級別: 初級
    訪問情況 1014 次瀏覽
    建議: 0 (添加評論)

    1 star2 stars3 stars4 stars5 stars 平均分 (共 3 個評分 )

    開發(fā)一個簡單的 OSGi Web 應(yīng)用實例

    一個簡單的 Web 應(yīng)用

    我們寫一個簡單的 Web 應(yīng)用 compute.html :計算兩個數(shù)字的和或乘積。如下圖所示:


    圖 1. 一個簡單例子
     一個簡單例子

    一個簡單例子.bmp

    為了體現(xiàn) OSGi bundle 的動態(tài)部署能力,我們寫兩個 service bundle,其中一個計算兩個數(shù)字的和(稱為 add bundle),另外一個計算兩個數(shù)字的積(稱為 multiply bundle)。 當(dāng)我們點擊“Compute”按鈕的時候,如果此時 add bundle 被部署,則頁面將返回兩個數(shù)字的和,否則如果此時 multiply bundle 被部署,則頁面將返回兩個數(shù)字的積。

    開發(fā)環(huán)境準(zhǔn)備

    1. 下載 Eclipse 3.4
    2. 獲取所有 OSGi, Equinox 和 Spring 的插件, 如下圖所示:

    圖 2. 相關(guān)插件列表
    相關(guān)插件列表
    1. 打開 Eclipse, 設(shè)置 target platform 為上述插件集合

    基本模塊設(shè)計

    該應(yīng)用主要包含兩個層次: 服務(wù)層和 Web 層。Web 層基于 Spring-MVC 實現(xiàn),包含處理 Web訪問相關(guān)的 bundle(本例中只有一個)。服務(wù)層包含處理數(shù)字計算的 bundle,本例中包含一個聲明服務(wù)接口的 compute interface bundle 和兩個實現(xiàn)該服務(wù)接口的 bundle :add bundle 和 multiply bundle。基本模塊結(jié)構(gòu)如下圖所示:


    圖 3. 基本框架
    基本框架

    模塊程序?qū)崿F(xiàn)

    Step 1 :實現(xiàn) Service Layer

    服務(wù)層的三個 OSGi bundle 實現(xiàn)完畢之后如下圖所示 :


    圖 4. 服務(wù)層
    服務(wù)層

    服務(wù)層.bmp

    其中 com.zxn.example.service.compute 是聲明服務(wù)接口的 bundle。com.zxn.example.service.compute.add和 com.zxn.example.service.compute.multiply 是實現(xiàn)了服務(wù)接口的兩個 bundle。

    1. com.zxn.example.service.compute

    聲明一個 Compute 接口,其中包含一個接口方法 computeNums(),如下圖所示 :


    圖 5. 服務(wù)層接口 bundle
    服務(wù)層接口 bundle
    1. com.zxn.example.service.compute.add

    bundle com.zxn.example.service.compute.add 的基本程序結(jié)構(gòu)如下圖所示:


    圖 6. 接口實現(xiàn) bundle :add
    接口實現(xiàn) bundle :add

    在該 add bundle 中,添加一個 Add 類,實現(xiàn) Compute 接口,如下圖所示:


    圖 7. 接口實現(xiàn)代碼 :Add 類
    接口實現(xiàn)代碼 :add 類

    注意到我們在 META-INF 下建了一個 spring 目錄,并且添加了一個 computeAdd-context.xml 文件。系統(tǒng)啟動時,Spring 將利用該 xml 文件創(chuàng)建一個 bean 實例,并把該 bean 輸出為一個 OSGi service,如下圖所示 :


    圖 8. Spring 聲明文件 :computeAdd-context.xml
    Spring 聲明文件 :computeadd-context.xml

    該xml文件中,osgi : service是 Spring-DM 輸出 OSGi service 的標(biāo)記,其中的 interface屬性標(biāo)明了該 service 實現(xiàn)的服務(wù)接口。

    1. com.zxn.example.service.compute.multiply

    按照與 add bundle 同樣的方法,實現(xiàn) multiply bundle,如下圖所示:


    圖 9. 接口實現(xiàn)代碼:Multiply 類
    接口實現(xiàn)代碼:Multiply 類

    接口實現(xiàn)代碼-Multiply類.bmp

    類似的,添加一個 computeMultiply-context.xml 輸出 OSGi service,如下圖所示 :


    圖 10. Spring 聲明文件:computeMultiply-context.xml
    Spring 聲明文件:computemultiply-context.xml

    Step 2 :實現(xiàn) Web Layer

    Web 層只包含一個 bundle:com.zxn.example.web,采用 Spring-MVC 和 OSGi 構(gòu)建,基本程序結(jié)構(gòu)如下圖所示:


    圖 11. Web Layer 程序結(jié)構(gòu)
    Web layer 程序結(jié)構(gòu)
    1. ComputeControler.java

    該JAVA類實現(xiàn)了 org.springframework.web.servlet.mvc.Controller是本 web應(yīng)用中核心的 servlet,負責(zé)接受并處理 web 請求。該類調(diào)用 ComputeServiceRef 的方法實現(xiàn)業(yè)務(wù)邏輯。該類關(guān)鍵的方法是 handleRequest(…), 如下圖所示 :


    圖 12. 核心 servlet 類
    核心 servlet 類
    1. ComputeServiceRef.java

    該 JAVA 類負責(zé)引用部署的 service bundle 完成最終計算,其中的 computeService 由 Spring 根據(jù) OSGi 中實際部署的 service 進行注入。本例中,實際部署的 service 可能是 add bundle 或者 multiply bundle。

    需要特別注意的是,此處體現(xiàn)了 Spring-DM 的動態(tài)特性。OSGi 的動態(tài)部署能力使得 Spring 的動態(tài)服務(wù)注入成為可能。


    圖 13. 服務(wù)消費類
    服務(wù)消費類
    1. HTTPContextResgistry.java

    該 JAVA 類負責(zé)在 OSGi 環(huán)境中配置和注冊 HTTP 服務(wù),其關(guān)鍵方法為 bean 初始化時調(diào)用的 init( ) 方法。


    圖 14. 在 OSGi 環(huán)境中注冊 HTTP 服務(wù)
    在 osgi 環(huán)境中注冊 http 服務(wù)

    該 init 方法中,第六行的 getHTTPService(…) 調(diào)用 OSGi 的 ServiceTracker 來獲取 OSGi環(huán)境中注冊的 HTTP 服務(wù)的引用,如下圖所示:


    圖 15. 使用 ServiceTracker 獲取 HTTP 服務(wù)
    使用 servicetracker 獲取 http 服務(wù)
    1. computeWeb-context.xml

    該 xml 文件主要用于配置 HTTPContextResgistry bean 類,以及導(dǎo)入對 Compute 服務(wù)接口的引用。標(biāo)記 osgi : reference 用于聲明要導(dǎo)入的服務(wù)接口,其 interface 屬性標(biāo)明了該接口的定義,本例中為 com.zxn.example.service.compute.Compute 接口。


    圖 16. Spring 聲明文件:導(dǎo)入服務(wù)接口
    Spring 聲明文件:導(dǎo)入服務(wù)接口
    1. computeWeb-Dispatcher.xml

    該 xml 文件用于配置 ComputeControler bean類。


    圖 17. Spring 聲明文件:配置核心 servlet 類
    Spring 聲明文件:配置核心 servlet 類

    運行程序

    以往開發(fā) J2EE 應(yīng)用通常需要將應(yīng)用服務(wù)器的 runtime 集成到開發(fā)環(huán)境中才能進行程序調(diào)試,非常麻煩。基于 OSGi 的應(yīng)用完全可以脫離應(yīng)用服務(wù)器運行,這使得程序開發(fā)和調(diào)試變得非常容易,直接在 Eclipse 中調(diào)試運行就可以。我們在 Eclipse 中將程序運行起來,如下圖所示:


    圖18. 運行 OSGi 程序
    圖 18. 運行 osgi 程序

    從上圖中看到,我們同時選擇部署了 add bundle 和 multiply bundle,利用 OSGi console 察看如下:


    圖 19. 察看部署的 OSGi bundle
    察看部署的 osgi bundle

    當(dāng) OSGi 環(huán)境中同時部署有多個服務(wù)接口的實現(xiàn) bundle 時,OSGi 會選擇一個默認(rèn)的 bundle提供服務(wù)。本例中,Spring 會默認(rèn)注入 add bundle。我們通過 web 訪問 compute.html 頁面:


    圖 20. 訪問頁面
    訪問頁面

    點 Compute 按鈕之后,結(jié)果頁面如下:


    圖 21. 訪問結(jié)果
    圖 21. 訪問結(jié)果

    可以看出,是 add bundle 提供了計算服務(wù)。下面我們通過命令 <stop 76> 來停止 add bundle的服務(wù):


    圖 22. 停止 add bundle
    停止 add bundle

    圖 23. add bundle 狀態(tài)變?yōu)?RESOLVED
    add bundle 狀態(tài)變?yōu)?resolved

    重新訪問 compute.html 頁面,結(jié)果得到的是兩個數(shù)字的乘積。可以看出,是 multiply bundl

    提供了計算服務(wù)。如下圖所示:


    圖 24. 再次訪問頁面
    圖 24. 再次訪問頁面 

      本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
      轉(zhuǎn)藏 分享 獻花(0

      0條評論

      發(fā)表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 亚洲AV无码乱码在线观看牲色 | 国产亚洲精品成人aa片新蒲金 | 日本高清乱理伦片中文字幕| 国产不卡在线一区二区| 国产精品大片中文字幕| 最新亚洲av日韩av二区| 欧美成人精品三级在线观看| 亚洲AV无码专区国产乱码电影| 极品尤物被啪到呻吟喷水| 色欲香天天天综合网站无码| 精品无码国产污污污免费| 亚洲国产成人资源在线| 国产成人A在线视频免费| 免费A级毛片中文字幕| 粗大的内捧猛烈进出小视频| 高清国产MV视频在线观看| 少妇人妻偷人免费观看| 九九电影网午夜理论片| 久久亚洲精品情侣| 国产好大好硬好爽免费不卡| 蜜桃久久精品成人无码AV| 国产激情视频在线观看的| 亚洲精品一区二区制服| 国产又黄又爽又刺激的免费网址| WWW夜片内射视频在观看视频| 欧美交a欧美精品喷水| 在线看无码的免费网站| 美女乱子伦高潮在线观看完整片 | 尹人香蕉久久99天天拍| 欧美高清精品一区二区| 久久中文字幕一区二区| 国产福利姬喷水福利在线观看| 亚洲午夜理论无码电影| 波多野结衣在线精品视频| 久女女热精品视频在线观看| 欧美黑人XXXX性高清版| 久久精品国产亚洲av天海翼 | 搡女人真爽免费视频大全| 大地资源中文第二页日本| 亚洲人成网线在线播放VA| 成A人片亚洲日本久久|