获取OSGi包上下文的最佳技术?

时间:2011-06-29 21:10:12

标签: java osgi

我的OSGi项目中的每个bundle都有它自己的BundleActivator,我认为这是正常的。这会传递当前的BundleContext,这对于获取服务引用和诸如此类的东西很有用。

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

4 个答案:

答案 0 :(得分:51)

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

请参阅FrameworkUtil JavaDoc

答案 1 :(得分:17)

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

因此,在整个地方使用静态引用或FrameworkUtil并不是一个好主意。也没有使用普通的OSGi。尝试查看iPOJO或声明服务。

答案 2 :(得分:11)

另一种方法是使用Declarative Services,它允许您将BundleContext接收到您的激活方法中。例如,假设您使用DS的Bnd Annotations:

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

然而正如RaduK所说,如果你能用POJO风格编写大部分代码而不使用BundleContext等OSGi API,那就更好了。

答案 3 :(得分:-3)

这里没有魔力。您需要一些方法来向其他类提供信息。因此,它可以通过调用堆栈或在一些众所周知的地方(例如静态)获得。