OSGi簡介
OSGi簡介OSGi: Open Services Gateway Initiative,它的初衷是建立一個開放性的平臺,通過這個平臺可以很容易的發布可管理的服務和應用到本地網絡和設備,以達到設備管理的目的。JSR232和OSGi有著密切的聯系(其實是完全一樣的),JSR232就是OSGi的Framework規范加上OSGi Mobile的規范。OSGi Framework主要解決底層Runtime Model問題,而OSGi Mobile是基于OSGi Framework之上的關于OMA DM的實現。
OSGi目前的應用越來越廣泛,特別是OSGi Framework。像Eclipse就是基于OSGi Framework之上擴展出來的。而且,當前很多企業級的架構,例如Spring等等都把自己的Runtime Model建立在OSGi Framework之上。接下來,我將就OSGi Framework最神秘最吸引人(自認為)的Class Loading架構進行闡述。
2. Class Loading Architecture
在OSGi Framework中,Bundle是模塊化管理的單元,所有的應用和資源都必須以Bundle作為載體。每個Bundle都有自己的Class Loader,不同Bundle之間(在同一個VM中)可以通過Import和Export機制共享或者隱藏Package。Class Loader建立一種Loading Class的代理模型,來實現上面所說的共享或隱藏機制:
Class Loader可以從以下幾個方面來加載Classes和Resources:
· Boot class path — 主要包括java.*和實現的Packages。
· Framework class path — Framework其實也是Bundle,只不過叫System Bundle,那么它也會有自己的class loader。
· Bundle Space — 當然就是Bundle自己啦以及一些附加的資源,例如Fragments。
如果給定一個Bundle Class Loader,那么這個Class Loader所能訪問的classes包括(這就是所謂的Class Space):
· Parent class loader所加載的classes,通常是java.*之類的classes。
· Imported packages
· Required bundles
· Bundle 自身的Classpath
· Fragment
同一個Class Space不能存在這種情況:兩個類擁有相同的Qualified Name(Name Space + Simple Class Name)。而不同的Class Space則可以存在這種情況,即兩個類擁有相同的Qualified Name。這使得,在同一個VM中,可以同時存在一個類的不同版本。
3. Runtime Class Loading
當一個Bundle Class Loader加載一個class或resource時,它的步驟如下:
- 如果這個被加載的class或資源包含在Java.*包中,那么這個加載請求就會被傳遞給Parent Class Loader;否則,進入下一步。如果請求被傳遞給Parent Class Loader,而Parent Class Loader也沒找到相應的資源,那么加載過程以失敗結束。
- 如果包含被加載的class或resource的package被定義在Boot Delegation表中時(org.osgi.framework.bootdelegation),那么這個請求將被傳遞到Parent Class Loader。如果找到相應的class或resource,那么加載過程以成功結束。
- 如果這個被加載的class或resource包含在Import-Package中,那么這個請求將被傳遞到Export這個Package的Bundle Class Loader(此時,這個class或資源可能已經被加載到VM中了)。否則進入下一步。
- 如果這個被加載的class或resource包含在Required-Bundle中,那么這個請求將被傳遞給這個Required-Bundle Class Loader。如果沒有找到,那么進入下一步。
- 在此Bundle自身的class path中尋找被加載的class或資源。如果沒有找到,那么進入下一步。
- 在此Bundle的Fragment的class path中尋找,查詢按Fragment的Bundle ID的順序。如果沒有找到,那么進入下一步。
- 如果這個被加載的class或resource包含在Import-Package或Required-Bundle中(但是到這一步還是沒有找到),那么加載過程以失敗結束。否則,進入下一步。
- 如果這個被加載的class或resource包含在DynamicImport-Package中,那么這個Dynamic Import將被建立。如果這個Dynamic Import不能成功建立(主要看依賴條件是否被滿足),那么加載過程以失敗結束。
- 如果Dynamic Import成功建立,那么這個請求將被傳遞給Export這個package的Bundle Class Loader。如果在這種情況下,也沒有找到class或resource,那么加載過程以失敗結束。
以下是具體的流程圖(來源于OSGi core specification R4):
v
posted on 2008-04-17 18:19 gembin 閱讀(1075) 評論(0) 編輯 收藏 所屬分類: OSGi