gpt4 book ai didi

java - OSGI SCR 框架中的可选依赖项

转载 作者:行者123 更新时间:2023-11-30 08:28:50 25 4
gpt4 key购买 nike

我在 OSGI felix 平台中使用 SCR 框架在我的组件中注入(inject)服务引用。这很好用,除了可选的依赖项。因此,如果我有两个组件 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 接口(interface)的包部署在我的 OSGi 平台中,它就可以工作。如果平台中没有激活 Bar 实现组件,SCR 仍然会很高兴并会激活我的 FooImpl 组件,当然不会引用任何 Bar 实现。但是,如果 Bar 接口(interface)未部署在平台中,则 SCR 在我的组件激活期间崩溃,可能是由于通过反射检查我的组件时出现异常,但我无法确定。

那么,有没有一种方法可以部署带有可选依赖项的 OSGI bundle ,这些依赖项在平台中不存在,其中包括 SCR 组件,这些组件具有对来自这些可选 OSGi 依赖项的接口(interface)的可选引用?

最佳答案

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

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

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

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

bar-api 仍然是 FooImpl 所必需的,但是 bar-impl 是真正可选的,在 Felix 控制台中禁用它不会中断引用组件。

关于java - OSGI SCR 框架中的可选依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19964386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com