我对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
}
据我了解,这是不可能的。然后出现了问题:如何根据某些条件控制捆绑软件或其引用的激活?即我希望我的捆绑包在满足条件时被激活(在激活之前),或者在不满足条件时被停用。它不适合我:“仅执行if语句,如果不满意,什么也不做,但仍然被激活”,因为此捆绑包的“激活”资源非常繁重。也许我对OSGI的想法完全错误。
答案 0 :(得分:2)
这不是您应该做的事情。只要您的捆绑包可以解析(即满足其所有导入和其他静态依赖关系),就应始终将其激活。
实际上,除非您要对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
的服务可用时。您将可以通过最后的AnotherService
字段调用service
。这是强制性的服务引用,这是DS中的默认设置,但也可以创建可选的动态引用(即可以在组件生命周期内重新绑定到其他服务实例的引用),但是不必担心这些用例,直到以后在OSGi学习中。