如何仅在满足特定条件时激活 OSGI 包?

How to activate an OSGI bundle only when the certain condition is satisfied?

我对 OSGI 有点陌生,我想要以下内容:仅当满足某些先决条件时才激活我的包(顺便说一句,我们从本机库中获取,但这是另一回事)。 AFAIK 它可以通过@Reference DS 实现,但我没有完全理解这个想法。我的意思是如果我在 @Activate DS 之前写这样的东西:

@Reference
public AnotherService as

@Activate
public void activate() {
   //some code 
}

这实际上意味着,在激活 AnotherService 之前,我的捆绑包不会被激活。但是我可以在 AnotherService 或我的包中写这样的东西吗?:

@Activate
public void activate() {
   if (condition){
       deactivate()
   }
   //some code 
}

@Deactivate
public void deactivate() {
//some code
}

据我了解,这是不可能的。那么问题来了:我如何根据特定条件控制我的包或其引用的激活? IE。我希望我的捆绑包在满足条件时(在激活前)被激活,或者在不满足条件时被停用。它不适合我的方式:"just make if-statement, if it is not satisfied, do nothing, but still be activated",因为这个包的 'activiy' 非常耗费资源。也许我只是对 OSGI 有一个完全错误的想法。

这不是你应该做的事。只要它可以解析,你的包就应该始终被激活(即它的所有导入和其他静态依赖项都得到满足)。

事实上,除非您在高级水平上编写 OSGi,否则您根本不应该编写 BundleActivators。如果您正在阅读 2020 年的 OSGi 教程,告诉您编写 BundleActivator,请停止阅读...该教程是垃圾。

您应该使用声明式服务组件。组件是由 OSGi 管理的对象,并且可以将其生命周期绑定到服务的可用性。例如:

@Component
public class MyComponent implements MyService {

  private final AnotherService service;

  @Activate
  public MyComponent(@Reference AnotherService service) {
    this.service = service;
  }

  @Override
  public void doSomething() {
    // ...
  }
}

在此示例中,将创建 MyComponent 的实例并将其发布为 MyService 类型的服务 仅当 类型的服务时 AnotherService 可用。您将能够通过最后的 service 字段调用 AnotherService。这是强制服务引用,这是 DS 中的默认设置,但也可以创建可选和动态引用(即可以在组件的生命周期内重新绑定到其他服务实例的引用),但不要担心这些用例将在您的 OSGi 学习后期使用。