gembin

          OSGi, Eclipse Equinox, ECF, Virgo, Gemini, Apache Felix, Karaf, Aires, Camel, Eclipse RCP

          HBase, Hadoop, ZooKeeper, Cassandra

          Flex4, AS3, Swiz framework, GraniteDS, BlazeDS etc.

          There is nothing that software can't fix. Unfortunately, there is also nothing that software can't completely fuck up. That gap is called talent.

          About Me

           

          OSGi簡介

          OSGi簡介

          OSGi: Open Services Gateway Initiative,它的初衷是建立一個開放性的平臺,通過這個平臺可以很容易的發布可管理的服務和應用到本地網絡和設備,以達到設備管理的目的。JSR232OSGi有著密切的聯系(其實是完全一樣的),JSR232就是OSGiFramework規范加上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中)可以通過ImportExport機制共享或者隱藏PackageClass Loader建立一種Loading Class的代理模型,來實現上面所說的共享或隱藏機制:

          Class Loader可以從以下幾個方面來加載ClassesResources

          ·        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 NameName Space + Simple Class Name)。而不同的Class Space則可以存在這種情況,即兩個類擁有相同的Qualified Name。這使得,在同一個VM中,可以同時存在一個類的不同版本。

           

          3.      Runtime Class Loading

          當一個Bundle Class Loader加載一個classresource時,它的步驟如下:

          1. 如果這個被加載的class或資源包含在Java.*包中,那么這個加載請求就會被傳遞給Parent Class Loader;否則,進入下一步。如果請求被傳遞給Parent Class Loader,而Parent Class Loader也沒找到相應的資源,那么加載過程以失敗結束。
          2. 如果包含被加載的classresourcepackage被定義在Boot Delegation表中時(org.osgi.framework.bootdelegation),那么這個請求將被傳遞到Parent Class Loader。如果找到相應的classresource,那么加載過程以成功結束。
          3. 如果這個被加載的classresource包含在Import-Package中,那么這個請求將被傳遞到Export這個PackageBundle Class Loader(此時,這個class或資源可能已經被加載到VM中了)。否則進入下一步。
          4. 如果這個被加載的classresource包含在Required-Bundle中,那么這個請求將被傳遞給這個Required-Bundle Class Loader。如果沒有找到,那么進入下一步。
          5. 在此Bundle自身的class path中尋找被加載的class或資源。如果沒有找到,那么進入下一步。
          6. 在此BundleFragmentclass path中尋找,查詢按FragmentBundle ID的順序。如果沒有找到,那么進入下一步。
          7. 如果這個被加載的classresource包含在Import-PackageRequired-Bundle中(但是到這一步還是沒有找到),那么加載過程以失敗結束。否則,進入下一步。
          8. 如果這個被加載的classresource包含在DynamicImport-Package中,那么這個Dynamic Import將被建立。如果這個Dynamic Import不能成功建立(主要看依賴條件是否被滿足),那么加載過程以失敗結束。
          9. 如果Dynamic Import成功建立,那么這個請求將被傳遞給Export這個packageBundle Class Loader。如果在這種情況下,也沒有找到classresource,那么加載過程以失敗結束。

           

          以下是具體的流程圖(來源于OSGi core specification R4):

          v

          posted on 2008-04-17 18:19 gembin 閱讀(1075) 評論(0)  編輯  收藏 所屬分類: OSGi

          導航

          統計

          常用鏈接

          留言簿(6)

          隨筆分類(440)

          隨筆檔案(378)

          文章檔案(6)

          新聞檔案(1)

          相冊

          收藏夾(9)

          Adobe

          Android

          AS3

          Blog-Links

          Build

          Design Pattern

          Eclipse

          Favorite Links

          Flickr

          Game Dev

          HBase

          Identity Management

          IT resources

          JEE

          Language

          OpenID

          OSGi

          SOA

          Version Control

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          free counters
          主站蜘蛛池模板: 宜州市| 濮阳市| 沅陵县| 元氏县| 武威市| 新密市| 江津市| 丰镇市| 兖州市| 昔阳县| 高唐县| 巴青县| 保定市| 肇州县| 万载县| 阳江市| 玛沁县| 克拉玛依市| 黄梅县| 吉水县| 胶南市| 庆安县| 广平县| 时尚| 梅州市| 临澧县| 克什克腾旗| 台中县| 隆子县| 潢川县| 平谷区| 漯河市| 苏尼特右旗| 沙雅县| 南安市| 南木林县| 枣强县| 周宁县| 东平县| 彭州市| 施秉县|