如何仅在满足特定条件时激活 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 学习后期使用。
我对 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 学习后期使用。