OSGi组件模型中包内和包间的相互依赖 [英] Intra- and inter-bundle mutual dependencies in OSGi component models

查看:6
本文介绍了OSGi组件模型中包内和包间的相互依赖的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

interface Service1 { ... }

interface Service2 { ... }

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

public class Service1Impl implements Service1 { 

    private Service2 service2;
    ...

}

public class Service2Impl implements Service2 { 

    private Service1 service1;
    ...

}

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

推荐答案

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

112.3.5循环引用

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

循环引用必须在以下情况下由SCR检测 满足组件配置和SCR的尝试必须失败 满足周期中涉及的引用并记录错误消息 使用日志服务(如果存在)。但是,如果其中一个引用 该循环具有可选的基数,SCR必须打破该循环。这个 具有可选基数的引用可以满足并绑定到 零目标服务。因此,这个循环被打破了,另一个 可能会满足推荐人。

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

当周期的成员被请求提供组件实例时, Blueprint Container必须通过在循环的成员中找到一个破坏成员来打破循环。中断成员必须使用属性注入 对于导致循环的依赖。蓝图容器可以选择 周期中任何适合用于断裂构件的构件(如果没有该等构件) 可以找到,则初始化失败或getComponentInstance 方法必须引发组件定义异常。

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

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

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

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

适用于iPOJO

支持您的特定情况。我不能在其他情况下说话 但不知道进一步的描述。

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

这篇关于OSGi组件模型中包内和包间的相互依赖的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆