OSGi體系結(jié)構(gòu)
OSGi 的初衷是面向嵌入式系統(tǒng)的應(yīng)用,支持在一個Java虛擬機上加載和啟動多個Java應(yīng)用程序。隨著OSGi在Eclipse3.0上的應(yīng)用成功,其逐漸成為構(gòu)建純插件結(jié)構(gòu)的企業(yè)級應(yīng)用軟件系統(tǒng)的首選平臺。
OSGi 是一個純插件的體系結(jié)構(gòu),
OSGi 框架實現(xiàn)是一個最為核心的插件,邏輯實現(xiàn)分層見下面兩張圖:
L0層Java執(zhí)行環(huán)境
OSGi最初規(guī)范定位到嵌入式系統(tǒng),例如家電、汽車、手機等執(zhí)行環(huán)境,所以插件要配置適合的運行環(huán)境與Policy。當(dāng)OSGi框架加載插件時會對插件要求的執(zhí)行環(huán)境做校驗。例如,Eclipse中可以配置下圖中的執(zhí)行環(huán)境:
L1模塊層(組件或插件層)
L1模塊層(插件層 或組件層)定義插件的ClassLoading策略(Policy),這也是OSGi最為出色和吸引人的地方。我們知道,任何一個Java平臺的插件體系結(jié)構(gòu),首先要解決的是ClassLoading的問題。OSGi在Java動態(tài)ClassLoading基礎(chǔ)之上,提供了完美的插件ClassLoading解決方案。傳統(tǒng)J2SE程序,有單一的Classpath包含所有的classes與resources,L1插件層為每個OSGi插件提供了私有的Classpath和獨立的Classloader,有效的控制了插件間的Class隔離、依賴與協(xié)作。
插件間的Class依賴關(guān)系見下圖(版權(quán)歸www.osgi.org):
插件的類空間(Class Space)見下圖(版權(quán)歸www.osgi.org):
插件的類加載過程:
L2插件生命周期管理層
L2層負(fù)責(zé)運行時動態(tài)安裝(Install)、啟動(Start)、停止(Stop)、更新(Update)或卸載(Uninstall)插件。
插件的生命周期見下圖(版權(quán)歸www.osgi.org):
L3服務(wù)注冊層
L3提供了一個動態(tài)的服務(wù)注冊模型,插件可以注冊(register)、發(fā)現(xiàn)(lookup)、使用(reference)服務(wù)。
該層的服務(wù)注冊采用ServiceLocator模式,見下面圖示:
該層的實現(xiàn)由于沒有直接的IoC容器支持,被很多過分相信IoC作用的人所批評。MartinFowler曾經(jīng)說過,“說一個系統(tǒng)是基于IoC的,就好像說一個汽車有四個輪子”,IoC只不過是一種模式和設(shè)計原則,任何一個設(shè)計得比較好的面向?qū)ο笙到y(tǒng)都或多或少的具備這樣的特征,這與存不存在一個獨立的IoC容器關(guān)系不大,盡管IoC容器在開發(fā)上帶來很大的便利與優(yōu)勢。另外一個方面,IoC容器本質(zhì)上還是一個Service Registry,只不過增加依賴裝配功能,所以在OSGi的服務(wù)注冊模型上,可以很容易的支持IoC。
OpenCore在該層的服務(wù)模型下實現(xiàn)了非常靈活的分級IoC容器,支持插件級、應(yīng)用程序級、網(wǎng)絡(luò)級的IoC功能。