OSGi 组件模型中bundle内和bundle之间的相互依赖关系



在我当前的应用程序中,我在几个地方遇到了这种模式:我在单个捆绑包中有两个服务接口,它们执行不同但相关的工作。

interface Service1 { ... }
interface Service2 { ... }

并希望让单例组件实现两者,但发现每个组件都需要对另一个组件的引用:

public class Service1Impl implements Service1 { 
    private Service2 service2;
    ...
}
public class Service2Impl implements Service2 { 
    private Service1 service1;
    ...
}

三个OSGi组件模型(DS,蓝图和iPOJO(中的哪一个允许这样做:1(当Service1ImplService2Impl在同一捆绑包中时;2(当它们在不同的捆绑包中时?

声明性服务规范,版本 1.1:

112.3.5 循环引用

一组组件描述可以创建循环依赖项。例如,如果 组件 A 引用组件 B 提供的服务,并且 组件 B 引用组件 A 提供的服务,然后 A 一个组件的组件配置无法满足 访问另一个组件的部分激活的组件实例 元件。SCR 必须确保组件实例永远不会 可由另一个组件实例访问或作为服务访问,直到它具有 已完全激活,即它已从其激活方法返回 如果有的话。

循环引用必须由 SCR 检测,当它 尝试满足组件配置和 SCR 必须失败 满足循环中涉及的引用并记录错误消息 与日志服务(如果存在(。但是,如果其中一个引用 循环具有可选的基数 SCR 必须打破循环。这 具有可选基数的引用可以满足并绑定到 零目标服务。因此,循环被打破,另一个 参考文献可能得到满足。

蓝图规范明确允许这样做,前提是依赖循环中至少有一个成员将其他成员作为属性而不是参数(121.2.6 循环依赖(:

当请求循环的成员提供组件实例时, 蓝图容器必须通过在循环成员中找到一个中断成员来打破循环。中断成员必须使用属性注入 对于导致循环的依赖关系。蓝图容器可以选择 任何合适的成员的循环为打破成员,如果没有这样的成员 可以找到,然后初始化失败或 getComponentInstance 方法必须引发组件定义异常。

中断成员必须返回部分初始化的组件实例 当要求它提供对象时。部分初始化的对象已完成 所有可能的初始化,但尚未使用 initMethod 调用(如果 指定(,也没有注入任何导致循环的属性。 部分初始化的组件实例的完成必须是 延迟,直到断裂构件被注入循环的所有参照构件中。终结意味着注入任何剩余的未设置属性并调用 initMethod(如果指定(。

部分初始化的组件实例的结果是它们 可以在设置所有属性之前使用,应用程序必须知道 的。

所有部分初始化的组件实例必须在 蓝图容器进入运行时阶段,在调用 getComponentInstance 方法返回一个组件实例。用户代码 通过递归调用 getComponentInstance 方法必须被检测并导致失败,这些 循环不能被打破。

应记录所有检测到的周期。

对于 iPOJO

支持您的具体情况。我不能为其他情况说话 不知道进一步的描述。

(在邮件列表中收到的答复(。

严格来说,你说的是不可能的,因为循环依赖。

Service1 只能在 Service2 处于活动状态时运行,反之亦然,因此框架没有启动服务的顺序。

据我所知,如果您将其中一个服务引用设置为可选,则可以使其工作,因此它可以在注入服务之前提供其服务,因此另一个 serviceimpl 可以重新提供其服务。

您可以在所有三个框架中执行此操作。 iPojo 具有可选引用,DS 具有服务要求的基数设置(使用 0..1 作为可选引用而不是 1..1(。蓝图我不太了解,但我相信可以做到。

问候,弗兰克

相关内容

  • 没有找到相关文章

最新更新