OSGi入門必讀系列《OSGi依賴性管理:Bundle訪問域》

(1)Bundle訪問域:

Bundle中類的缺省訪問範圍只對本Bundle內部可見,對其他任何Bundle都是不可見;

在Bundle內部,類的可訪問性遵循Java語言的一般規範性。

[ques]如何從一個Bundle中訪問另一個Bundle中的類?

[ans]將源Bundle中的包導出來,然後把它們導入到目標Bundle中。——詳見下面的(2)


(2)導出java包:

步驟:

A、創建com.javaworld.sample.HelloService Bundle。

[tips]入門必讀系列之《OSGi Bundle之Hello World》中介紹瞭如何創建一個bundle,併成功創建了一個com.javaworld.sample.helloworld的bundle,本步驟和HelloWorld Bundle的創建相同。

B、在HelloService Bundle中,創建一個com.javaworld.sample.service.HelloService.java接口,也就是在HelloService的Bundle項目中的src下,創建在com.javawrold.sample.service包中的接口文件HelloService.java.

C、在HelloService Bundle中實現HelloService.java的接口文件,也就是在HelloService的Bundle項目中的src下,創建在com.javawrold.sample.service.impl包中的接口實現文件HelloServiceImpl.java.

D、打開MANIFEST.MF文件,選擇Runtime(運行時)標籤,在“導出包”小節,單擊ADD按鈕,選擇com.javaworld.sample.service包,這時HelloService Bundle中的MANIFEST.MF文件源代碼會增加下面一行:

Export-Package:com.javaworld.sample.service

該屬性頭通知OSGi容器,其他bundle可以從HelloService Bundle外部訪問com.javaworld.sample.service包中的類。

[notice]在上面的示例中,只暴露了接口類HelloService,而沒有暴露HelloServiceImpl實現類。

(3)導入Java包:

將從HelloService Bundle中導出的com.javaworld.sample.service包導入到HelloWorld Bundle中,就可以在HelloWorld Bundle中訪問HelloService Bundle中的包了。

步驟:

A、在HelloWorld Bundle中找到MANIFEST.MF文件,點擊Dependencies(依賴性)標籤,然後點擊imported-package中的ADD按鈕將“com.javaworld.sample.service”添加爲導入包

B、這時HelloWorld Bundle中的MANIFEST.MF文件中Import-package會增加剛剛設置的導入包,從這裏可以看出,該屬性頭的值是一個由“,”分割的字符串,是想導入包的列表。默認會有org.osgi.framework包,該包中包含OSGi框架類,在按照“Hello OSGiBundle”模板自動生成的Activator.java文件中用到的BundleContext和BundleActivator都是屬於這個包。

C、如果打開HelloWorld Bundle中的Activator.java文件,發現可以訪問HelloService接口,但是不能訪問HelloServiceImpl實現類。因爲HelloServiceImpl是HelloService Bundle的一個內部類,任何其他Bundle都不能訪問它。

(4)[prob]OSGi是如何將一些jar文件中的一些類隱藏掉,而讓另外一些類可見呢?

[ans]OSGi容器使用java類加載器管理類的可見性,爲每個Bundle創建不同的類加載器,因此每個Bundle可以訪問位於下列位置中的類:

A、位於java啓動類路徑下、所有以java.*開頭的包中的類

B、位於OSGi框架類路徑下的類,通常有一個獨立的類加載器負責加載框架的實現類及關鍵的接口類

C、位於Bundle空間中的類,通常包含在與Bundle相關的jar文件中,以及加到這個Bundle中其他jar包中的類。

D、導入包中的類,如上面的“com.javaworld.sample.service”


文章地址:http://developer.51cto.com/art/200909/152333.htm


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章