【问题标题】:Combine OSGi blueprint and spring configuration结合 OSGi 蓝图和 spring 配置
【发布时间】:2012-11-22 02:47:47
【问题描述】:

关于 Spring 配置和 OSGi 蓝图(例如 Gemini 蓝图)的组合是否有任何好的/最佳实践?您使用哪些 XML 文件?你把它们放在你的 OSGi 包中的什么位置(META-INF/springOSGi-INF)?这些实践中的哪一种可以让您将捆绑包与非 Gemini 的蓝图实现结合使用?

背景:我们正在从 Spring/Spring DM 切换到 Spring/Blueprint。我知道 Blueprint 定义了一个 <bean> 元素。然而,我们偶尔会遇到蓝图规范有限的 bean 定义能力并不能满足我们所有需求的情况。因此,在我们的包中使用 Spring 配置和通过 OSGi 服务连接包的蓝图似乎是一个不错的选择。

【问题讨论】:

  • 很好的问题

标签: spring osgi spring-dm blueprint-osgi


【解决方案1】:

您使用哪些 XML 文件?你把它们放在你的 OSGi 包中的什么位置 (META-INF/弹簧,OSGi-INF)?这些做法中的哪一个可以让您 结合非双子座实现重用你的包 蓝图?

Gemini Blueprint 同等对待这两个目录,但 OSGI-INF/blueprint/*.xml 是通用 OSGi 蓝图规范中唯一指定的目录。

the Gemini Blueprint documentation 的建议做法是:

[...] 一个 建议的做法是拆分应用程序上下文配置 到至少两个文件中,按照约定 modulename-context.xml 命名 和模块名-osgi-context.xml。 modulename-context.xml 文件 包含独立于任何知识的常规 bean 定义 操作系统吉。 modulename-osgi-context.xml 文件包含 bean 用于导入和导出 OSGi 服务的定义。它可能(但 不需要)使用 Gemini Blueprint OSGi 模式作为顶层 命名空间而不是 Spring 'beans' 命名空间。

我试过了,效果很好。我将 Gemini Blueprint 用于我的一个项目,其中包含文件 META-INF/spring/context.xml,它定义了我的 bean 及其关系,以及 META-INF/spring/osgi-context.xml,它定义了哪些 bean 作为/从 OSGi 服务中公开/导入以及如何公开。 context.xml 看起来像

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
    <bean id="myOrdinarySpringBean" class="com.acme.impl.Foo"/>
</beans>

并且是一个普通的普通 Spring 应用程序上下文,根本没有 Blueprint/OSGi 配置。 osgi-context.xml 看起来像

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
    <service id="myOsgiService" ref="myOrdinarySpringBean" interface="com.acme.Foo"/>
</blueprint>

当然,您也可以在此处使用 &lt;beans&gt; 命名空间和根元素,但您必须定义一个 xmlns:osgi 并像这样为服务添加前缀:&lt;osgi:service .../&gt; 才能工作。就我而言,我不需要 Gemini 特定蓝图的东西,所以我对这个通用蓝图配置很满意。同样,我也可以在 context.xml 中使用 &lt;blueprint&gt; 命名空间,但是这个特定的应用程序是一个旧的,正在移植到 OSGi,所以我现在更愿意保留 Spring 特定的配置。

另一个应用程序又拥有自己的osgi-context.xmllike

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
  <reference id="myOrdinarySpringBeanImportedFromOsgi" interface="com.acme.Foo" availability="mandatory"/>
</blueprint>

目前没有,但可以拥有自己的 context.xml 喜欢

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
    <bean id="myOrdinaryOtherSpringBean" class="com.acme.impl.Bar">
        <property name="foo" ref="myOrdinarySpringBeanImportedFromOsgi"/>
    </bean>
</beans>

并且真的不在乎myOrdinarySpringBeanImportedFromOsgi 是从 OSGi 服务导入还是定义为同一应用程序上下文中的常规普通 Spring bean。

如果我想将自己与 Gemini 蓝图实现分离,这些 META-INF/osgi-context.xml 配置可以轻松地移动到 OSGI-INF/blueprint/,但目前我更喜欢将这两部分放在同一个地方以避免弄乱目录结构。

【讨论】:

  • 嗨 @Emil Lundberg 在定义 Spring 应用上下文时是否必须使用基于 xml 的配置
  • @jayantmishra 抱歉,我不知道 - 自从我 5 年前写这篇文章以来,我还没有真正接触过 Spring 或 OSGi。
  • 这是一个很好的答案,我非常感谢你
【解决方案2】:

蓝图文件应位于 OSGI-INF/blueprint/ 下,并命名为 *.xml(通常为 blueprint.xml)。此位置符合 OSGi 4.2 蓝图规范,适用于 Aries 或 Gemini。

Spring-DM 文件(你可能知道)在 META-INF/spring/ 下,也被命名为 *.xml(通常是 beans.xml)

这两个文件应该能够和平共存。但是,只有在您安装了对每个容器的支持时,它们才会起作用。

应通过 OSGi 服务注册表进行接线。

至于迁移,我们一直使用 Spring-DM 来实现我们在 Blueprint 中无法实现的功能。其他所有内容都已迁移到 Blueprint。

【讨论】:

  • 我认为它在 JBoss Fuse 中不起作用。在 Aries OSGi xml 中导入的服务在 Spring DM xml 中无法识别。
  • 我认为您不能公开和使用同一个捆绑包中的服务。这不是蓝图/spring 互操作性问题。仅使用 spring 或仅使用 blueprint 也会发生同样的问题。
  • @mjmeno 是否必须为 Spring 应用程序上下文定义基于 xml 的配置,或者基于注释也可以?
  • @jayantmishra 我不确定,我不知道在我参与的项目中做过什么。一些搜索返回了docs.spring.io/spring-osgi/docs/current/reference/html/…,这意味着它可能是可能的。
  • @mjmeno 感谢您的指点,会尝试一下,让您知道
猜你喜欢
  • 2012-04-18
  • 2013-02-12
  • 2013-05-24
  • 1970-01-01
  • 2013-06-05
  • 2017-03-21
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多