【问题标题】:OSGi public bundlecontextOSGi 公共包上下文
【发布时间】:2014-10-15 14:44:30
【问题描述】:

将bundle的bundlecontext改为public有危险吗?

我想做的原因是,从不同的包访问上下文。

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

【问题讨论】:

  • 您的意思是将其存储在公共变量中?你会在哪里公开?在激活器中?您的意思是公共静态变量吗?
  • 是的,我想将它存储在一个公共静态变量中。目前它存储在一个受保护的静态变量中,工作正常。问题不在于它是否可以工作(它可以工作,我已经尝试过了),但问题是,这样做是否可以节省。

标签: java osgi osgi-bundle


【解决方案1】:

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

来自BundleContext的Javadoc:

BundleContext 对象仅在其上下文包执行期间有效;即,从上下文包处于 STARTING、STOPPING 和 ACTIVE 包状态的时间段内。 [...]

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

BundleContext 对象通常用于其关联包的私有使用,并不意味着与 OSGi 环境中的其他包共享。

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

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

如果您不小心将此公共静态变量放入导出包中的类中,其他人可以在没有权限检查的情况下访问它。

包导出和导入的问题

假设您有包 A 和 B。包 A 被导出但也被导入。包 B 中的类可能会看到来自不同包的包 A 类。在这种情况下,包 B 中的类将使用不同包的包上下文。

以上所有示例都是特殊示例,但它们显示了如果您将 BundleContext 存储在静态变量中,您很容易陷入困境。如果你小心一点,你不会造成任何麻烦,但请记住,你可能不是唯一一个更改项目代码的人。

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

【讨论】:

    【解决方案2】:

    我不认为将 BundleContext 存储在静态变量中是个好主意。更好地从 activator start 方法创建你的类并在那里注入 BundleContext。

    【讨论】:

    • 如果我这样做了,你能告诉我会发生什么吗?这只是不好的做法还是会有一些不好的行为?
    • 最大的问题是您将所有类都绑定到静态调用。这使得使用模拟进行测试变得更加困难。不确定运行时是否也有问题。
    猜你喜欢
    • 2011-04-16
    • 2023-03-25
    • 2011-10-08
    • 2011-09-25
    • 1970-01-01
    • 2012-05-25
    • 2011-05-07
    • 2015-07-18
    • 2012-08-18
    相关资源
    最近更新 更多