关于Spring配置和OSGi Blueprint(例如Gemini Blueprint)的组合是否有任何良好/最佳实践?您使用哪些XML文件?你把它们放在OSGi包中的哪个位置META-INF/spring
,OSGi-INF
)?哪些实践允许您将捆绑包与蓝图的非Gemini实现结合使用?
背景:我们正在从Spring / Spring DM切换到Spring / Blueprint。我知道定义<bean>
元素的蓝图。但是,我们偶尔会遇到蓝图规范的有限bean定义功能无法满足我们所有需求的情况。因此,在我们的捆绑包中使用Spring配置和通过OSGi服务连接捆绑包的Blueprint似乎是一个不错的选择。
答案 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中无法做到的功能。其他一切都已迁移到蓝图。