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

xco*_*ist 35 java osgi

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

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

Iva*_*rov 51

你可以用FrameworkUtil.getBundle(ClassFromBundle).getBundleContext().

请参见FrameworkUtil JavaDoc.

  • 谢谢,这种技术正是我追求的. (2认同)
  • 这比Activator中的静态变量更好吗?您现在依赖于静态框架方法而不是您自己的类.这使您的代码更难以测试. (2认同)
  • 它不一定更好,但 1. 您不必编写激活器 2. 您可以获得另一个包的上下文。在任何情况下,RaduK 在集中 OSGi 特定代码方面都是正确的。 (2认同)

Rad*_*duK 17

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

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


Nei*_*ett 11

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

@Activate
public void activate(BundleContext context) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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