首页 文章

OSGI SCR框架中的可选依赖项

提问于
浏览
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");
    }
}

这是有效的,只要在我的OSGi平台中部署了定义Bar接口的bundle . 如果在平台中没有激活Bar实现组件,SCR仍然很高兴并且将激活我的FooImpl组件,而不参考任何Bar实现 . 但是,如果未在平台中部署Bar接口,则在激活组件期间SCR会崩溃,这可能是由于通过反射检查组件的异常,但我无法确定 .

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

1 回答

  • 3

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

    但是,如果OSGi不知道您尝试用作字段的类型,则会出现异常,这是一种有效的行为 . 如果它的字段具有未知类型,则根本不能使用类 - 它不仅适用于OSGi,而且适用于Java .

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

    • bar-api 包含 Bar 界面,

    • bar-impl 包含OSGi服务 BarImpl .

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

相关问题