使用 osgi 的声明式服务时,我可以在同一个组件中提供和引用服务吗?

Posted

技术标签:

【中文标题】使用 osgi 的声明式服务时,我可以在同一个组件中提供和引用服务吗?【英文标题】:can I provide and reference services in the same component when use declarative services for osgi? 【发布时间】:2011-05-27 14:23:11 【问题描述】:

<?xml version="1.0" encoding="UTF-8"?> <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="sensor_test"> <implementation class="test.sensor.version1.serviceImpl.SensorServiceImpl"/> <service> <provide interface="test.sensor.version1.serviceInterface.SensorServiceInterface"/> </service> <reference bind="setOntologyService" cardinality="0..1" interface="test.ontology.version1.serviceinterface.OntologyServiceInterface" name="OntologyServiceInterface" policy="dynamic" unbind="unsetOntologyService"/> </scr:component>

对于上面显示的内容,可以在同一个组件中提供和引用服务吗? 例如,有两个捆绑包 A 和 B。A 提供服务供 B 使用,B 也提供服务供 A 使用。这种情况我该怎么办?

【问题讨论】:

【参考方案1】:

这似乎很好,因为服务引用既是可选的又是动态的。

如果您定义了一个循环依赖,其中引用都是强制性的,那么 DS 将报告错误。必须有一种方法首先创建一个组件,并且通过强制引用,在创建另一个组件之前都不能创建任何组件(但是,第三个捆绑包“C”可以注册满足其中一个组件的服务)。

使用可选/动态引用,DS 可以构造一个未绑定引用的组件,然后构造另一个组件并将其注入第一个组件。

【讨论】:

以上是关于使用 osgi 的声明式服务时,我可以在同一个组件中提供和引用服务吗?的主要内容,如果未能解决你的问题,请参考以下文章

OSGI传统注册式服务与声明式服务

使用 OSGi 将组件注入 POJO

在 JUnit 测试的上下文中使用 OSGi 声明式服务

OSGi:没有生命周期管理的服务绑定

Felix/OSGi:如何使用不是 OSGi 服务的 SCR 组件?

如何开始使用 OSGi