结合OSGi蓝图和弹簧配置

时间:2012-12-04 13:00:36

标签: spring osgi spring-dm blueprint-osgi

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

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

2 个答案:

答案 0 :(得分:12)

  

您使用哪些XML文件?你把它们放在OSGi包中的哪个位置   (META-INF / spring,OSGi-INF)?以下哪种做法可以帮助您   将您的bundle与非Gemini实现结合使用   蓝图?

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

the Gemini Blueprint documentation的建议做法是:

  

[...] A   建议的做法是拆分应用程序上下文配置   到至少两个文件,由convention modulename-context.xml命名   和modulename-osgi-context.xml。 modulename-context.xml文件   包含独立于任何知识的常规bean定义   OSGi的。 modulename-osgi-context.xml文件包含bean   导入和导出OSGi服务的定义。它可能(但是   不要求使用Gemini Blueprint OSGi架构作为顶级   命名空间而不是Spring'bean'命名空间。

我试过这个,效果很好。我将Gemini Blueprint用于我的一个项目,其中包含定义我的bean及其关系的文件META-INF/spring/context.xml,以及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并为服务添加前缀,如下所示:<osgi:service .../> for那工作。在我的情况下,我不需要Gemini特定Blueprint的东西,所以我很满意这个通用的Blueprint配置。同样,我也可以在<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>

并不关心从{OSCi服务导入myOrdinarySpringBeanImportedFromOsgi或在同一应用程序上下文中定义为普通普通Spring bean。

如果我想将自己与Gemini Blueprint实施分离,这些META-INF/osgi-context.xml配置可以简单地移动到OSGI-INF/blueprint/,但暂时我宁愿将两半放在同一个地方以避免弄乱了目录结构。

答案 1 :(得分:5)

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

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

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

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

至于迁移,我们一直在Spring-DM上寻找我们在Blueprint中无法做到的功能。其他一切都已迁移到蓝图。