OSGi - 我应该为每个包创建服务跟踪器吗?

OSGi - should I create service tracker for every bundle?

我有 10 个捆绑包(A、B、C..)。在 bundle A 中,我想创建服务跟踪器来跟踪那些实现某些接口的服务。这些 osgi 服务可以在任何包中(A、B、C..)。我认为我应该创建一个服务跟踪器并启动它。但是,让我感到困惑的是,有必要将对 bundleContext 的引用传递给构造函数(什么包的???)

 public class MyServiceTracker extends ServiceTracker{
 public MyServiceTracker(BundleContext context){
        super(context, SomeInterface.class.getName(), null);
        open();
    }
  ....
 }

在 javadoc 中它说(关于构造函数)

context - The BundleContext against which the tracking is done.

问题 - 为什么我应该传递 bundleContext,我应该传递什么 bundleContext 或者我应该为每个 bundle (A,B,C..) 创建跟踪器实例?

它是将包含 ServiceTracker 的包的 BundleContext。所以在你的情况下,捆绑 A.

每个使用服务的包都需要自己的 ServiceTracker。 ServiceTracker 将使用包的上下文来查找和绑定服务。您不想使用另一个捆绑包的上下文来跟踪您的捆绑包的服务,因为许多事情将无法正常工作,例如服务挂钩,因为所有服务似乎都被一个捆绑包使用,而该捆绑包的上下文用于 ServiceTracker。

更好的是,根本不要使用 ServiceTracker。使用声明式服务!

您可以实现一个服务组件,当具有特定接口(您的要求)的其他服务来来去去时进行监听(动态服务参考)。您可以在 acs example project.

中找到一种可能的示例实现