2

我在 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 依赖项的接口具有可选引用?

4

1 回答 1

3

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

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

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

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

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

于 2013-11-13T21:58:43.230 回答