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


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