Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取OSGi捆绑包上下文的最佳技术?_Java_Osgi - Fatal编程技术网

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

Java 获取OSGi捆绑包上下文的最佳技术?,java,osgi,Java,Osgi,我的OSGi项目中的每个bundle都有自己的BundleActivator,我认为这是正常的。这将传递当前BundleContext,这对于获取服务引用等非常有用 但是,如何从bundle中的类获取BundleContext?将其分配给BundleActivator中的公共静态字段很糟糕,将其作为参数传递也很糟糕。还有更聪明的方法吗 这里没有魔法。您需要某种方式向其他类提供信息。因此,它可以通过调用堆栈或在一些众所周知的地方(例如静态)使用 您可以使用FrameworkUtil.getBund

我的OSGi项目中的每个bundle都有自己的BundleActivator,我认为这是正常的。这将传递当前BundleContext,这对于获取服务引用等非常有用


但是,如何从bundle中的类获取BundleContext?将其分配给BundleActivator中的公共静态字段很糟糕,将其作为参数传递也很糟糕。还有更聪明的方法吗

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

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


请参阅。

在我看来,开发OSGi捆绑包时的一个好做法是尽可能集中地编写与OSGi相关的代码。这样,如果您希望在非OSGi环境中使用您的代码,那么迁移工作是最小的


因此,在imho中到处使用静态引用或FrameworkUtil不是一个好主意。也不是使用普通OSGi。尝试查看iPOJO或声明性服务。

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

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

然而,正如RaduK所说,如果您可以用POJO风格编写大部分代码,而不使用诸如BundleContext之类的OSGi API,那就更好了。

谢谢您,这项技术正是我所追求的。这怎么比Activator中的静态变量更好呢?您现在依赖的不是自己的类,而是静态框架方法。这使得您的代码更难测试。它不一定更好,但1。您不必编写Activator2。您可以获取另一个包的上下文。无论如何,RaduK关于集中OSGi特定代码的观点是正确的。这是一个有见地的评论,谢谢。我认识到将类与OSGi紧密集成是一种糟糕的做法,但另一个回答中的FrameworkUtil回答了这个问题。同样感谢您对声明性服务的引用,我也会仔细阅读。我支持这一点:PDE生成的默认激活器非常值得怀疑。我认为这是一个错误:服务激活方法采用组件上下文而不是绑定文本。但是,您可以从ComponentContext获取BundleContext。因此,您可以在services类中存储bundleContext的副本。不要使用BundleActivator方法执行此操作,因为BundleActivator不会使用与调用service activate方法时使用的实例相同的实例(假设您使用的是单例服务)(如果您从服务实例访问它,这将导致保存的bundleContext为null)@TomRutchik Activate可以根据需要选择ComponentContext或BundleContext。