11

关于 Spring 配置和 OSGi 蓝图(例如 Gemini 蓝图)的组合是否有任何好的/最佳实践?您使用哪些 XML 文件?您将它们放在您的 OSGi 包中的什么位置(META-INF/spring, OSGi-INF)?这些实践中的哪一个允许您将捆绑包与蓝图的非双子座实现结合使用?

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

4

2 回答 2

13

您使用哪些 XML 文件?你把它们放在你的 OSGi 包(META-INF/spring,OSGi-INF)的什么地方?这些实践中的哪一个允许您将捆绑包与蓝图的非双子座实现结合使用?

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

Gemini Blueprint 文档中的建议做法是:

[...] 建议的做法是将应用程序上下文配置拆分为至少两个文件,分别以约定 modulename-context.xml 和 modulename-osgi-context.xml 命名。modulename-context.xml 文件包含独立于任何 OSGi 知识的常规 bean 定义。modulename-osgi-context.xml 文件包含用于导入和导出 OSGi 服务的 bean 定义。它可以(但不是必须)使用 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>

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

另一个应用程序反过来有自己的osgi-context.xml喜欢

<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/

于 2013-07-04T09:35:11.197 回答
5

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

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

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

接线应通过 OSGi 服务注册表完成。

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

于 2013-02-21T18:25:41.173 回答