【问题标题】:Optional dependencies in OSGI SCR frameworkOSGI SCR 框架中的可选依赖项
【发布时间】:2013-11-26 16:19:36
【问题描述】:

我在 OSGI felix 平台中使用 SCR 框架在我的组件中注入服务引用。这很好用,除了可选的依赖项。因此,如果我有两个组件 Foo 和 Bar,其中 Foo 如下所示:

@Component
public class FooImpl implements Foo {
    Log log = LogFactory.getLog(this.getClass());
    @Reference(cardinality=ReferenceCardinality.OPTIONAL_UNARY)
    Bar bar;

    public void bindBar(Bar bar) {
        log.info("bar bound: "+bar);
    }
    public void unbindBar(Bar map) {
        log.info("bar unbound: "+bar);
    }

    @override
    public void fooHello() {
        log.info("Hello, this is an implementation of Foo");
    }
}

只要定义 Bar 接口的包部署在我的 OSGi 平台中,就可以了。如果平台中没有激活 Bar 实现组件,SCR 仍然很高兴并会激活我的 FooImpl 组件,当然无需参考任何 Bar 实现。但是,如果 Bar 接口未部署在平台中,则 SCR 在激活我的组件期间崩溃,可能是由于通过反射检查我的组件时出现异常,但我无法确定这一点。

那么,有没有办法部署一个 OSGI 捆绑包,其中包含平台中不存在的可选依赖项,其中包括 SCR 组件,这些组件对来自这些可选 OSGi 依赖项的接口具有可选引用?

【问题讨论】:

  • “SCR 崩溃”

标签: java dependencies osgi apache-felix


【解决方案1】:

OSGi 依赖项可用于注入某些类型的实现,例如实现Bar 接口的BarImpl 类,该接口可以注入@Reference Bar bar 字段。可选依赖意味着您的 OSGi 组件可以使用某些服务,但不需要它工作。

但是,如果 OSGi 不知道您尝试用作字段的类型,您将得到一个异常并且这是一个有效的行为。如果类的字段具有未知类型,则您根本无法使用该类 - 不仅适用于 OSGi,而且适用于一般 Java。

这里的一个好方法是将包含 Bar 实现的包拆分为两个包:

  • bar-api 包含Bar 接口,
  • bar-impl 包含 OSGi 服务 BarImpl

FooImpl 仍然需要bar-api,但bar-impl 确实是可选的,在 Felix 控制台中禁用它不会破坏引用组件。

【讨论】:

  • 我在 api bundle 和 implementation bundle 之间进行了拆分,但是有许多可选的依赖项,我仍然需要所有的 api bundles。在这种情况下,我有一个用于各种不相关项目的通用组件。我将尝试在类和/或包上找到另一个函数拆分。
  • Java 类解析没有你说的那么严格:静态方法可以工作,即使不是所有字段都可以解析。允许导入未使用的包,并且未实例化的字段可以由它们自己非解析。我希望(d) 找到一个不需要所有接口都存在于平台中的解决方案。
猜你喜欢
  • 2016-01-01
  • 2020-11-14
  • 2010-09-05
  • 2012-11-17
  • 2015-11-11
  • 2013-03-05
  • 2015-10-04
  • 1970-01-01
  • 2012-12-21
相关资源
最近更新 更多