我的OSGi项目中的每个bundle都有它自己的BundleActivator,我认为这是正常的。这会传递当前的BundleContext,这对于获取服务引用和诸如此类的东西很有用。
但是,从我的bundle中的类,我如何获得BundleContext?将它分配给BundleActivator中的公共静态字段很糟糕,并将其作为参数传递也很糟糕。有更智能的方式吗?
答案 0 :(得分:51)
您可以使用FrameworkUtil.getBundle(ClassFromBundle).getBundleContext()
。
答案 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)
这里没有魔力。您需要一些方法来向其他类提供信息。因此,它可以通过调用堆栈或在一些众所周知的地方(例如静态)获得。