OSGi公共bundlecontext

时间:2014-10-15 14:44:31

标签: java osgi osgi-bundle

将捆绑的bundlecontext更改为public是否很危险?

我之所以要做的是从不同的包中访问Context。

当然,解决方法是在实例化对象时将上下文作为参数传递。但如果公开上下文不会太危险,那么这种方式会更容易。

2 个答案:

答案 0 :(得分:1)

出于几个原因,我不会将BundleContext存储在公共静态变量中。

来自BundleContext的Javadoc:

  

BundleContext对象仅在其上下文包的执行期间有效;也就是说,在上下文捆绑包处于STARTING,STOPPING和ACTIVE捆绑包状态期间。 [...]

如果这样做,您可能会忘记在捆绑停止时设置静态变量。在这种情况下,其他人可以在标记为删除状态时访问捆绑上下文。在这种状态下,其他人仍然连接到这个捆绑包。

  

BundleContext对象通常用于私有使用其关联的bundle,并不打算与OSGi环境中的其他bundle共享。

通过将BundleContext分配给静态变量,您可以让其他人访问它。好吧,如果这个类是在一个非导出的包中,那就更难了,但仍然可以得到它。

  

Bundle可以适应其BundleContext。为了使此成功,如果Java运行时环境支持权限,则调用者必须具有相应的AdminPermission [bundle,CONTEXT]。

如果您意外地将此公共静态变量放入导出包中的类,则其他人可以在未经权限检查的情况下访问它。

如果导出和导入包

,则会出现问题

想象一下,您有包A和B.包A已导出但也已导入。可能会发生包B中的类将看到来自不同包的包A类。在这种情况下,包B中的类将使用不同包的包上下文。

以上所有示例都是特殊的例子,但它们表明如果将BundleContext存储在静态变量中,您会遇到麻烦。如果你小心,你不会有任何麻烦,但请记住,你可能不是唯一一个改变项目代码的人。

通常,使用静态变量(常量除外)或函数不是一个好习惯,尤其是在OSGi中。如果你想使用它们中的任何一个,现在是时候询问你是否应该重构代码。

答案 1 :(得分:0)

我认为将BundleContext存储在静态变量中并不是一个好主意。最好从激活器启动方法创建类,并在那里注入BundleContext。