我遇到过一种情况,我想在运行时使用Blueprint(白羊座)来解决依赖关系,并且实现是在需要它的同一个包中定义的,并且不会在任何其他包中使用。我正在对该捆绑包中的实现进行抽象化,以使在进行单元测试时更容易模拟依赖关系。如果我将此服务放在自己的捆绑包中,则会导致凝聚力差。

在运行时,蓝图表示它正在等待依赖关系。如何使用Blueprint在捆绑包中实现依赖项注入?

<!-- Interface -->
<reference id="modelEntityMapper" interface="org.example.blog.rest.cxf.server.model.ModelEntityMapper" />
<!-- Implementation defined within same bundle -->
<bean id="modelEntityMapperImpl" class="org.example.blog.rest.cxf.server.model.impl.ModelEntityMapperImpl" />
<service ref="modelEntityMapperImpl" interface="org.example.blog.rest.cxf.server.model.ModelEntityMapper" />

<!-- Object which has dependency -->
<bean id="posts" class="org.example.blog.rest.cxf.server.BlogResourceImpl">
        <property name="modelEntityMapper" ref="modelEntityMapper" />
</bean>


编辑

我只是尝试了@ christian-scheider的建议,Blueprint仍在等待某些服务来满足ModelEntityMapper

XML

<!-- Interface -->
<reference id="modelEntityMapper" interface="org.example.blog.rest.cxf.server.model.ModelEntityMapper" />
<!-- Implementation defined within same bundle -->
<bean id="modelEntityMapperImpl" class="org.example.blog.rest.cxf.server.model.impl.ModelEntityMapperImpl" />

<!-- Object which has dependency -->
<bean id="posts" class="org.example.blog.rest.cxf.server.BlogResourceImpl">
        <property name="modelEntityMapper" ref="modelEntityMapperImpl" />
</bean>


日志

Bundle rest-cxf-server is waiting for dependencies [(objectClass=org.example.blog.rest.cxf.server.model.ModelEntityMapper)]

最佳答案

我无法在Aries网站上找到与捆绑销售相关的详细文档,因此,我将参考Eclipse Gemini Blueprint实现文档(以前称为Spring Dynamic Modules)。请参阅section 9.2.1.1 of their documentation中的警告。是的,从技术上讲,这与它们的实现有关,但是我相信这可能与Aries类似。


声明对也由同一捆绑包导出的服务的强制引用是错误的,此行为可能导致应用程序上下文创建因死锁或超时而失败。


简而言之,您通常可以在同一个捆绑软件中导入(引用)OSGi服务,也可以导出OSGi服务,通常,您不尝试在单个捆绑软件中同时做这两项。

如果希望此捆绑包导出类型为ModelEntityMapper的服务,则需要使用service元素将其导出。当其他bean在同一个包中需要引用时,可以像使用它一样使用ref属性。在这种情况下,您根本不需要reference元素,而是使用service元素。

如果您不打算在此捆绑软件之外使用ModelEntityMapper bean,则根本不需要在配置中使用referenceservice元素。您应该能够在ref属性中使用它,而无需将其导出为OSGi服务-它基本上是该捆绑软件的内部bean。在这种情况下,您应该能够完全删除reference元素:<bean id="modelEntityMapperImpl" ...将在包内部创建一个bean,而<property name="modelEntityMapper" ref="modelEntityMapperImpl" />元素应能够在包内部使用该bean。

如果要从OSGi导入类型为ModelEntityMapper的引用(如果可用),否则请使用内部定义的备用,这样会变得更加复杂。您必须声明一个非强制性reference并将该引用与内部定义的bean一起注入您的类中,然后具有检查它们可用性的默认逻辑。或者,您可以只在与接口分开的捆绑中定义实现。

09-11 19:21
查看更多