OSGi和Spring入門(mén):什么是Spring動(dòng)態(tài)模型(Spring DM)?
譯文【51CTO精選譯文】本文是《你好,OSGi》系列的第五部分。從本篇開(kāi)始將講述Spring動(dòng)態(tài)模型。我們將一起來(lái)發(fā)現(xiàn),為什么Spring動(dòng)態(tài)模型對(duì)于開(kāi)發(fā)者是一個(gè)如此令人興奮的選擇。這些開(kāi)發(fā)者已經(jīng)對(duì)Spring配置非常熟悉,并需要挖掘OSGi的模塊性、簡(jiǎn)易的版本控制以及應(yīng)用程序生命周期支持。
51CTO編輯推薦:OSGi入門(mén)與實(shí)踐全攻略
使用OSGi和Spring構(gòu)建面向服務(wù)的應(yīng)用程序
OSGi,也稱(chēng)為 Java 語(yǔ)言動(dòng)態(tài)模塊系統(tǒng),它為 Java 應(yīng)用程序開(kāi)發(fā)指定了一種模塊方法,以及一組標(biāo)準(zhǔn)化的模塊,用于管理模塊之間的從屬性。OSGi服務(wù)平臺(tái)的Spring動(dòng)態(tài)模型項(xiàng)目(即Spring動(dòng)態(tài)模型,簡(jiǎn)稱(chēng)Spring DM)允許開(kāi)發(fā)者構(gòu)建Spring應(yīng)用程序,這種應(yīng)用程序能夠在OSGi容器中進(jìn)行部署。對(duì)于熟悉Spring編程和配置模型的 Java 企業(yè)開(kāi)發(fā)者,Spring動(dòng)態(tài)模型是一種較為簡(jiǎn)易的方式,可用來(lái)熟悉OSGi的應(yīng)用程序開(kāi)發(fā)的模塊化方法。除了允許Spring開(kāi)發(fā)者進(jìn)行OSGi的模塊化架構(gòu)和動(dòng)態(tài)配置之外,Spring動(dòng)態(tài)模型還提供了多數(shù)OSGi應(yīng)用程序所需的低階編程,因此你能夠?qū)⒅攸c(diǎn)放在應(yīng)用程序的業(yè)務(wù)邏輯上。
在該系列文章的第一節(jié)中(《你好,OSGi,第一節(jié):Bundles 入門(mén)》),我們介紹了一種OSGi開(kāi)發(fā)的標(biāo)準(zhǔn)方式,使用了OSGiAPI 和開(kāi)源的 Equinox 容器實(shí)施。你已經(jīng)學(xué)習(xí)了有關(guān)OSGi架構(gòu)的知識(shí),尤其是容器和套件(bundle),并且第一次開(kāi)發(fā)了一個(gè)基于OSGi的 Hello World 應(yīng)用程序。由于這個(gè)示例的目標(biāo)僅僅是為了理解OSGi的基礎(chǔ)功能,因此該應(yīng)用程序示例并不是很深入。
在本節(jié)中,你將再次構(gòu)建一個(gè) Hello World 應(yīng)用程序,這次將使用Spring動(dòng)態(tài)模型框架。你將會(huì)學(xué)到什么是Spring DM以及它在模塊中利用OSGi應(yīng)用程序邏輯的分離性,以及其模塊邊界的運(yùn)行時(shí)強(qiáng)制執(zhí)行。此外,你還會(huì)學(xué)習(xí)如何使用Spring動(dòng)態(tài)模型完成以下事項(xiàng):
在正在運(yùn)行的系統(tǒng)中,動(dòng)態(tài)安裝,升級(jí)以及卸載模塊。
通過(guò)動(dòng)態(tài)地發(fā)現(xiàn)和使用系統(tǒng)中其他模塊提供的服務(wù),構(gòu)建面向服務(wù)的應(yīng)用程序(SOA)。
使用Spring的 DataSource 類(lèi)對(duì)系統(tǒng)模塊之間以及跨越系統(tǒng)模塊的組件進(jìn)行實(shí)例化、配置、組裝(assemble)以及添加裝飾性功能。
你將看到,使用Spring動(dòng)態(tài)模型可以讓你免除某些死板的機(jī)械工作,以及更為困難的工作:理解OSGi框架之下發(fā)生了什么。因此,你將能夠深入挖掘應(yīng)用程序邏輯,并在開(kāi)發(fā)流程中更快地完成這種挖掘。
為了理解本節(jié)中的示例,你需要一個(gè)包含 Eclipse 3.3 和Spring動(dòng)態(tài)模型的開(kāi)發(fā)環(huán)境。
OSGi和Spring框架
目前OSGi的流行程度增加急速上升。某些應(yīng)用程序服務(wù)器已經(jīng)記過(guò)重新裝備以利用OSGi的模塊化框架,其中包括 IBM 的 WebSphere 應(yīng)用程序服務(wù)器、BEA 的 microService 架構(gòu)(mSA),以及JOnAS 5,一個(gè)開(kāi)源的應(yīng)用程序服務(wù)器,該服務(wù)器在OSGi的架構(gòu)之上從基礎(chǔ)進(jìn)行構(gòu)建。JBoss 也在開(kāi)發(fā)基于OSGi的類(lèi)加載程序(classloader)并計(jì)劃參加一個(gè)OSGi核心規(guī)則實(shí)施。也許最重要的是,Eclipse 基金會(huì)(Eclipse Foundation)的OSGi容器/運(yùn)行時(shí)組件引擎 Equinox 最近已經(jīng)升級(jí)為頂級(jí)的項(xiàng)目狀態(tài),在這種狀態(tài)下,它將被用作新的 Eclipse 運(yùn)行時(shí)規(guī)范(Eclipse Runtime Initiative)的基礎(chǔ)。
甚至在OSGi當(dāng)前的流行度激增之前,已經(jīng)存在將其與Spring組合中一起的討論,這一討論帶來(lái)了OSGi服務(wù)平臺(tái)的Spring動(dòng)態(tài)模型(SpringDynamic Modules forOSGiService Platforms )項(xiàng)目。Spring動(dòng)態(tài)模型的功能可以劃分為兩個(gè)主要部分:第一個(gè)功能是它以O(shè)SGi套件(bundle)的形式提供Spring框架 JAR。從上一章節(jié)中你已經(jīng)了解到,OSGi套件不過(guò)是 Java Achive(JAR)文件,這些文件在一個(gè) META-INF/MANIFEST.MF 文件中包含了額外的條目,它可以作為OSGi套件的部署描述器(descriptor)。(請(qǐng)注意,在使用OSGi時(shí),你不能夠直接部署 JAR 文件;你需要使用OSGi套件格式對(duì)其進(jìn)行裝配。)
第二個(gè)功能,Spring DM提供了三個(gè)OSGi專(zhuān)用的Spring套件/JAR:
- org.springframeork.osgi.bundle.extender
- org.springframeork.osgi.bundle.core
- org.springframeork.osgi.bundle.io
使用Spring動(dòng)態(tài)模型構(gòu)建的應(yīng)用程序,其構(gòu)建方式不同于那些使用Spring框架的應(yīng)用程序。當(dāng)構(gòu)建一個(gè)Spring應(yīng)用程序時(shí),你在一個(gè)或多個(gè)Spring配置文件中定義了配置信息,這種配置文件絕大多數(shù)為 XML 文件。在應(yīng)用程序啟動(dòng)時(shí),Spring框架使用這些配置文件創(chuàng)建應(yīng)用程序語(yǔ)境(application-context)對(duì)象。當(dāng)應(yīng)用程序語(yǔ)境創(chuàng)建之后,它將用于對(duì)該應(yīng)用程序中的對(duì)象進(jìn)行實(shí)例化、配置、組裝(assemble)以及添加裝飾性功能。
對(duì)于Spring動(dòng)態(tài)模型,在啟動(dòng)時(shí),org.springframeork.osgi.bundle.extender 查詢所有處于解析(resolved)狀態(tài)以了解它們是否由Spring提供(Springpowered)。如果套件具有Spring-Context 清單頭(manifest header),或者在其 META-INF/spring 文件夾中包含 XML 文件,extender 套件將認(rèn)為該套件是由Spring提供的。
當(dāng)找到Spring提供的套件時(shí),org.springframeork.osgi.bundle.extender 將在該套件中加載Spring配置文件,以并它創(chuàng)建一個(gè)應(yīng)用程序-語(yǔ)境對(duì)象。在創(chuàng)建應(yīng)用程序-語(yǔ)境對(duì)象時(shí),該 extender 還會(huì)檢查該套件是否正在輸出OSGi服務(wù)。如果是,它將輸出該Springbean 到OSGi共享服務(wù)寄存器(registry)。如果套件正在導(dǎo)入OSGi服務(wù),它將找到該服務(wù)并將其作為該 bean 的應(yīng)用程序語(yǔ)境中的正常Springbean 進(jìn)行添加。該 extender 還為套件事件注冊(cè)了一個(gè)監(jiān)聽(tīng)器,這樣,無(wú)論任何OSGi套件是否進(jìn)入解析狀態(tài),它都將檢查它是否由Spring提供并遵循相同的步驟。
在接下來(lái)的文章中,你將從設(shè)置相關(guān)環(huán)境開(kāi)始,開(kāi)發(fā)出你的第一個(gè)Spring動(dòng)態(tài)模型應(yīng)用程序,在這一過(guò)程中,上述問(wèn)題都將變得明朗清晰。敬請(qǐng)期待!
【編輯推薦】