知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X(jué)表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
您當(dāng)前位置>首頁(yè) » 新聞資訊 » 網(wǎng)站建設(shè) >
基于OSGi和Spring開(kāi)發(fā)Web應(yīng)用
發(fā)表時(shí)間:2015-8-11
發(fā)布人:葵宇科技
瀏覽次數(shù):54
作為一個(gè)新的事實(shí)上的工業(yè)標(biāo)準(zhǔn),OSGi 已經(jīng)受到了廣泛的關(guān)注, 其面向服務(wù)(接口)的基本思想和動(dòng)態(tài)模塊部署的能力, 是企業(yè)級(jí)應(yīng)用長(zhǎng)期以來(lái)一直追求的目標(biāo)。Spring 是一個(gè)著名的輕量級(jí)J2EE 開(kāi)發(fā)框架,其特點(diǎn)是面向接口編程和非侵入式的依賴注入。將 OSGi 和 Spring 結(jié)合能充分發(fā)揮二者各自的特長(zhǎng),更好地滿足企業(yè)級(jí)應(yīng)用開(kāi)發(fā)的需求。Spring 開(kāi)發(fā)組織在 2008 年發(fā)布了將 OSGi 和 Spring 結(jié)合的第一個(gè)版本:Spring-DM。本文通過(guò)一個(gè)簡(jiǎn)單實(shí)例,介紹如何利用 Spring-DM 開(kāi)發(fā)基于 OSGi 和 Spring 架構(gòu)的 Web 應(yīng)用,同時(shí)探討其中用到的關(guān)鍵技術(shù)及其基本思想。
開(kāi)發(fā)一個(gè)簡(jiǎn)單的OSGi Web 應(yīng)用實(shí)例——一個(gè)簡(jiǎn)單的 Web 應(yīng)用
我們寫(xiě)一個(gè)簡(jiǎn)單的 Web 應(yīng)用 compute.html :計(jì)算兩個(gè)數(shù)字的和或乘積。如下圖所示:
圖 1. 一個(gè)簡(jiǎn)單例子
為了體現(xiàn) OSGi bundle 的動(dòng)態(tài)部署能力,我們寫(xiě)兩個(gè) service bundle,其中一個(gè)計(jì)算兩個(gè)數(shù)字的和(稱為 add bundle),另外一個(gè)計(jì)算兩個(gè)數(shù)字的積(稱為 multiply bundle)。 當(dāng)我們點(diǎn)擊“Compute”按鈕的時(shí)候,如果此時(shí) add bundle 被部署,則頁(yè)面將返回兩個(gè)數(shù)字的和,否則如果此時(shí) multiply bundle 被部署,則頁(yè)面將返回兩個(gè)數(shù)字的積。
開(kāi)發(fā)環(huán)境準(zhǔn)備
- 下載 Eclipse 3.4
- 獲取所有 OSGi, Equinox 和 Spring 的插件, 如下圖所示:
圖 2. 相關(guān)插件列表
- 打開(kāi) Eclipse, 設(shè)置 target platform 為上述插件集合
基本模塊設(shè)計(jì)
該應(yīng)用主要包含兩個(gè)層次: 服務(wù)層和 Web 層。Web 層基于 Spring-MVC 實(shí)現(xiàn),包含處理 Web訪問(wèn)相關(guān)的 bundle(本例中只有一個(gè))。服務(wù)層包含處理數(shù)字計(jì)算的 bundle,本例中包含一個(gè)聲明服務(wù)接口的 compute interface bundle 和兩個(gè)實(shí)現(xiàn)該服務(wù)接口的 bundle :add bundle 和 multiply bundle。基本模塊結(jié)構(gòu)如下圖所示:
圖 3. 基本框架
模塊程序?qū)崿F(xiàn)
Step 1 :實(shí)現(xiàn) Service Layer
服務(wù)層的三個(gè) OSGi bundle 實(shí)現(xiàn)完畢之后如下圖所示 :
圖 4. 服務(wù)層
服務(wù)層.bmp
其中 com.zxn.example.service.compute 是聲明服務(wù)接口的 bundle。com.zxn.example.service.compute.add和com.zxn.example.service.compute.multiply 是實(shí)現(xiàn)了服務(wù)接口的兩個(gè) bundle。
- com.zxn.example.service.compute
聲明一個(gè) Compute 接口,其中包含一個(gè)接口方法 computeNums(),如下圖所示 :
圖 5. 服務(wù)層接口 bundle
- com.zxn.example.service.compute.add
bundle com.zxn.example.service.compute.add 的基本程序結(jié)構(gòu)如下圖所示:
圖 6. 接口實(shí)現(xiàn) bundle :add
在該 add bundle 中,添加一個(gè) Add 類,實(shí)現(xiàn) Compute 接口,如下圖所示:
圖 7. 接口實(shí)現(xiàn)代碼 :Add 類
注意到我們?cè)?META-INF 下建了一個(gè) spring 目錄,并且添加了一個(gè) computeAdd-context.xml 文件。系統(tǒng)啟動(dòng)時(shí),Spring 將利用該 xml 文件創(chuàng)建一個(gè) bean 實(shí)例,并把該 bean 輸出為一個(gè) OSGi service,如下圖所示 :
圖 8. Spring 聲明文件 :computeAdd-context.xml
該xml文件中,osgi : service是 Spring-DM 輸出 OSGi service 的標(biāo)記,其中的 interface屬性標(biāo)明了該 service 實(shí)現(xiàn)的服務(wù)接口。
- com.zxn.example.service.compute.multiply
按照與 add bundle 同樣的方法,實(shí)現(xiàn) multiply bundle,如下圖所示:
圖 9. 接口實(shí)現(xiàn)代碼:Multiply 類
接口實(shí)現(xiàn)代碼-Multiply類.bmp
類似的,添加一個(gè) computeMultiply-context.xml 輸出 OSGi service,如下圖所示 :
圖 10. Spring 聲明文件:computeMultiply-context.xml
Step 2 :實(shí)現(xiàn) Web Layer
Web 層只包含一個(gè) bundle:com.zxn.example.web,采用 Spring-MVC 和 OSGi 構(gòu)建,基本程序結(jié)構(gòu)如下圖所示:
圖 11. Web Layer 程序結(jié)構(gòu)
- ComputeControler.java
該JAVA類實(shí)現(xiàn)了 org.springframework.web.servlet.mvc.Controller
,
是本 web應(yīng)用中核心的 servlet,負(fù)責(zé)接受并處理 web 請(qǐng)求。該類調(diào)用 ComputeServiceRef 的方法實(shí)現(xiàn)業(yè)務(wù)邏輯。該類關(guān)鍵的方法是 handleRequest(…), 如下圖所示 :
圖 12. 核心 servlet 類
- ComputeServiceRef.java
該 JAVA 類負(fù)責(zé)引用部署的 service bundle 完成最終計(jì)算,其中的 computeService 由 Spring 根據(jù) OSGi 中實(shí)際部署的 service 進(jìn)行注入。本例中,實(shí)際部署的 service 可能是 add bundle 或者 multiply bundle。
需要特別注意的是,此處體現(xiàn)了 Spring-DM 的動(dòng)態(tài)特性。OSGi 的動(dòng)態(tài)部署能力使得 Spring 的動(dòng)態(tài)服務(wù)注入成為可能。
圖 13. 服務(wù)消費(fèi)類
- HTTPContextResgistry.java
該 JAVA 類負(fù)責(zé)在 OSGi 環(huán)境中配置和注冊(cè) HTTP 服務(wù),其關(guān)鍵方法為 bean 初始化時(shí)調(diào)用的 init( ) 方法。
圖 14. 在 OSGi 環(huán)境中注冊(cè) HTTP 服務(wù)
該 init 方法中,第六行的 getHTTPService(…) 調(diào)用 OSGi 的 ServiceTracker 來(lái)獲取 OSGi環(huán)境中注冊(cè)的 HTTP 服務(wù)的引用,如下圖所示:
圖 15. 使用 ServiceTracker 獲取 HTTP 服務(wù)
- computeWeb-context.xml
該 xml 文件主要用于配置 HTTPContextResgistry bean 類,以及導(dǎo)入對(duì) Compute 服務(wù)接口的引用。標(biāo)記 osgi : reference用于聲明要導(dǎo)入的服務(wù)接口,其 interface 屬性標(biāo)明了該接口的定義,本例中為 com.zxn.example.service.compute.Compute 接口。
圖 16. Spring 聲明文件:導(dǎo)入服務(wù)接口
- computeWeb-Dispatcher.xml
該 xml 文件用于配置 ComputeControler bean類。
圖 17. Spring 聲明文件:配置核心 servlet 類
回頁(yè)首
運(yùn)行程序
以往開(kāi)發(fā) J2EE 應(yīng)用通常需要將應(yīng)用服務(wù)器的 runtime 集成到開(kāi)發(fā)環(huán)境中才能進(jìn)行程序調(diào)試,非常麻煩?;?OSGi 的應(yīng)用完全可以脫離應(yīng)用服務(wù)器運(yùn)行,這使得程序開(kāi)發(fā)和調(diào)試變得非常容易,直接在 Eclipse 中調(diào)試運(yùn)行就可以。我們?cè)?Eclipse 中將程序運(yùn)行起來(lái),如下圖所示:
圖18. 運(yùn)行 OSGi 程序
從上圖中看到,我們同時(shí)選擇部署了 add bundle 和 multiply bundle,利用 OSGi console 察看如下:
圖 19. 察看部署的 OSGi bundle
當(dāng) OSGi 環(huán)境中同時(shí)部署有多個(gè)服務(wù)接口的實(shí)現(xiàn) bundle 時(shí),OSGi 會(huì)選擇一個(gè)默認(rèn)的 bundle提供服務(wù)。本例中,Spring 會(huì)默認(rèn)注入 add bundle。我們通過(guò) web 訪問(wèn) compute.html 頁(yè)面:
圖 20. 訪問(wèn)頁(yè)面
點(diǎn) Compute 按鈕之后,結(jié)果頁(yè)面如下:
圖 21. 訪問(wèn)結(jié)果
可以看出,是 add bundle 提供了計(jì)算服務(wù)。下面我們通過(guò)命令 <stop 76> 來(lái)停止 add bundle的服務(wù):
圖 22. 停止 add bundle
圖 23. add bundle 狀態(tài)變?yōu)?RESOLVED
重新訪問(wèn) compute.html 頁(yè)面,結(jié)果得到的是兩個(gè)數(shù)字的乘積??梢钥闯?#xff0c;是 multiply bundl
提供了計(jì)算服務(wù)。如下圖所示:
圖 24. 再次訪問(wèn)頁(yè)面
小結(jié)
作為當(dāng)前頗具生命力的兩個(gè)標(biāo)準(zhǔn)和框架,OSGi 和 Spring 已經(jīng)初步融合在一起。二者的結(jié)合,為開(kāi)發(fā)企業(yè)級(jí)的 Web 應(yīng)用同時(shí)提供了巨大的靈活性和動(dòng)態(tài)部署能力。本文通過(guò)一個(gè)簡(jiǎn)單的例子,描述如何開(kāi)發(fā)一個(gè)基于 OSGi 和 Spring 的 Web 應(yīng)用,并說(shuō)明了開(kāi)發(fā)過(guò)程中涉及到的技術(shù)關(guān)鍵點(diǎn)。
對(duì)應(yīng)的源代碼下載地址:http://download.csdn.net/detail/zmx729618/8989709
相關(guān)案例查看更多
相關(guān)閱讀
- 網(wǎng)站建設(shè)百度官方
- 云南網(wǎng)站建設(shè)哪家好
- 政府網(wǎng)站建設(shè)服務(wù)
- 網(wǎng)站沒(méi)排名
- 網(wǎng)站制作
- 云南旅游網(wǎng)站建設(shè)
- 云南網(wǎng)站建設(shè)快速優(yōu)化
- 云南網(wǎng)站建設(shè)靠譜公司
- 云南網(wǎng)站建設(shè)首選公司
- 云南網(wǎng)絡(luò)營(yíng)銷顧問(wèn)
- 昆明做網(wǎng)站
- 汽車拆解系統(tǒng)
- 支付寶小程序被騙
- 怎么做網(wǎng)站
- 小程序制作
- 模版消息
- 網(wǎng)站制作哪家好
- 網(wǎng)絡(luò)公司聯(lián)系方式
- 昆明網(wǎng)站開(kāi)發(fā)
- 網(wǎng)站排名
- 百度快速排名
- 軟件定制公司
- 微信分銷
- 云南省住房建設(shè)廳網(wǎng)站
- 小程序分銷商城
- 云南省城鄉(xiāng)建設(shè)廳網(wǎng)站
- 海南小程序制作公司
- 網(wǎng)站建設(shè)專業(yè)品牌
- 旅游網(wǎng)站建設(shè)
- 保險(xiǎn)網(wǎng)站建設(shè)公司