您使用哪些 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/