我的OSGi项目中的每个包都有它自己的BundleActivator,我认为这是正常的.这会传递当前的BundleContext,这对于获取服务引用和诸如此类的东西很有用.
但是,从我的bundle中的类,我如何获得BundleContext?将它分配给BundleActivator中的公共静态字段很糟糕,并将其作为参数传递也很糟糕.有更智能的方式吗?
Iva*_*rov 51
你可以用FrameworkUtil.getBundle(ClassFromBundle).getBundleContext().
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,那就更好了.