首页 > 解决方案 > 捆绑激活后 OSGI 组件未激活

问题描述

OSGI 的新手。

我在 OSGI 中使用 spring-boot。在 bundle activator 中,spring-boot 应用程序启动成功。我有一个组件类如下

@Service // spring-boot annotation
@Component(immediate = true) // osgi annotation
public class Test {
    @Activate
    public void activate() {
        System.out.println("osgi component activated");
    }

    @Reference
    public void set(ServiceComponentXXX a) {
        System.out.println("reference got");
}

Test 类只绑定服务,不被任何其他服务绑定。ServiceComponnetXXX 类来自其他捆绑包。activate 和 set 方法永远不会执行。

删除 spring-boot 注释@Service 后,代码工作正常。所以问题是一个类可以既是 spring-boot 组件又是 OSGI 组件?

标签: spring-bootosgi

解决方案


让一个类两者兼而有之是没有意义的。Spring Boot 和声明式服务的生命周期是完全分开的。因此,在最好的情况下,您最终会得到该类的两个实例——一个由 Spring Boot 填充,另一个由声明性服务填充——但它更有可能只是不起作用。

我建议决定是否要使用 OSGi。如果是,那么只需使用声明性服务而不是 spring boot。通常决定一个注入框架。在 OSGi 中,您可以通过捆绑拥有一个注入框架,但它们必须与 OSGi 兼容。Spring Boot 并不是真正的 OSGi 兼容。


推荐阅读