【问题标题】:Best technique for getting the OSGi bundle context?获取 OSGi 包上下文的最佳技术?
【发布时间】:2011-09-25 12:27:48
【问题描述】:

我的 OSGi 项目中的每个包都有自己的 BundleActivator,我认为这很正常。这会通过当前的 BundleContext,这对于获取服务引用等很有用。

但是,如何从包中的类中获取 BundleContext?将它分配给 BundleActivator 中的公共静态字段很糟糕,并将它作为参数传递也很糟糕。有没有更智能的方法?

【问题讨论】:

标签: java osgi


【解决方案1】:

您可以使用FrameworkUtil.getBundle(ClassFromBundle).getBundleContext()

FrameworkUtil JavaDoc

【讨论】:

  • 谢谢,这个技术正是我所追求的。
  • 这比 Activator 中的静态变量好多少?您现在依赖于静态框架方法,而不是您自己的类。这使您的代码更难测试。
  • 不一定更好,但是 1. 你不必写激活器 2. 你可以得到另一个包的上下文。无论如何,RaduK 在集中 OSGi 特定代码方面是正确的。
【解决方案2】:

在我看来,在开发 OSGi 包时,一个好的做法是尝试尽可能集中地编写 OSGi 相关代码。这样,如果您想在非 OSGi 环境中使用您的代码,则迁移工作量是最小的。

因此,恕我直言,到处使用静态引用或 FrameworkUtil 并不是一个好主意。两者都没有使用普通的 OSGi。尝试查看 iPOJO 或声明式服务。

【讨论】:

  • 有见地的评论,谢谢。我认识到将类与 OSGi 紧密集成是不好的做法,但来自其他回复的 FrameworkUtil 回答了这个问题。还要感谢对声明式服务的引用,我也会阅读。
【解决方案3】:

另一种选择是使用声明式服务,它允许您将 BundleContext 接收到您的激活器方法中。例如,假设您使用 DS 的 Bnd 注释:

@Activate
public void activate(BundleContext context) {
    // ...
}

不过,正如 RaduK 所说,如果您可以在不使用 BundleContext 等 OSGi API 的情况下以 POJO 样式编写大部分代码,那就更好了。

【讨论】:

  • 服务激活方法采用 ComponentContext 而不是 BundleContext。但是,您可以从 ComponentContext 中获取 BundleContext。因此,您可以将 bundleContext 的副本存储在服务类中。不要使用 BundleActivator 方法执行此操作,因为假设您使用单例服务,BundleActivator 不会使用与调用服务激活方法时使用的实例相同的实例(如果您从服务实例)
  • @TomRutchik Activate 可以根据您的需要采用 ComponentContext 或 BundleContext。
【解决方案4】:

这里没有魔法。您需要某种方式将信息提供给其他类。因此它可以通过调用堆栈或在某个众所周知的地方(例如静态)获得。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 2017-05-24
    • 2013-07-06
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    相关资源
    最近更新 更多