【发布时间】:2012-06-14 13:31:42
【问题描述】:
我现在正在开发 OSGi 服务,我有一个关于在 OSGi 中使用服务的问题。有一些不同的方式来注册用户服务。任何人都可以解释 OSGi 服务跟踪器和声明式服务之间的区别吗?哪个更好?
【问题讨论】:
-
谢谢大家。你的所有回答都很有用。但我只能选择一个
我现在正在开发 OSGi 服务,我有一个关于在 OSGi 中使用服务的问题。有一些不同的方式来注册用户服务。任何人都可以解释 OSGi 服务跟踪器和声明式服务之间的区别吗?哪个更好?
【问题讨论】:
所有依赖项都必须安装在带有 maven 的 NetBeans 项目中的 pom.xml 文件中。 例如 org.osgi.core 将是:
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.core</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>
【讨论】:
声明式服务 (DS) 非常易于使用,并且您避免了与使用 ServiceTracker 相关的一些样板代码。如果您使用普通的 OSGI,仅使用 ServiceTracker,您需要注意 OSGI 服务的动态特性的某些方面。服务可以来来去去,您的组件需要处理它。如果您使用 DS,则大部分工作已经完成。您只需定义对其他服务的引用,DS 将在这些引用可用时注入这些引用。 DS 将在满足组件要求时激活您的组件。
如果您使用 Apache Felix SCR 注释或 bndlib 提供的注释,您还可以避免编写 Declarative Services 所需的 xml。最近,OSGI 小组也发布了他们的一个注释。我认为 bndlib 提供的和 OSGI 提供的非常相似,我几乎可以肯定 bnd 工具可以同时处理两者。
前段时间我使用过 Apache SCR 注释,但现在我更喜欢使用 bndlib,因为它包含 Metatype 的注释和一些使托管服务的实现更容易的类。元类型是与托管服务相关的规范。基本上,它提供了可供 Config Admin 实现使用的元数据,从而为组件的配置提供更加用户友好的界面。
我知道另外两种选择:iPojo 和 Blueprint。
iPojo 功能强大且功能丰富。它抽象了大部分 OSGI 内容,并包含一些不错的功能,例如 EventAdmin 支持和 ConfigAdmin 支持。
我用过一点Blueprint,但是因为过度使用xml我不太喜欢它。我想你可能会说 Blueprint 就像 OSGI 的 Spring。
【讨论】:
在 OSGi 中,ServiceTracker 是一种获取服务引用的编程方式。即,您编写 ServiceTracker 代码来“跟踪”对另一个服务的引用,并让您在它可用时使用它。
相比之下,声明式服务 (DS) 允许您声明注入到组件中的依赖项。 DS 是一种依赖注入的形式。服务之间的依赖关系图以及它们的启动顺序将决定您的服务何时启动。 DS 定义中的基数属性允许您声明关系是强制性的 (1..1)、具有至少一个的多重 (1..n)、可选 (0..1) 还是多重可选 (0..n )。 当您声明强制关系时,您的服务将在所有依赖项都满足之前不会启动。 当您声明一个可选关系时,无论依赖项的状态如何,您的服务都会启动,但您需要注意代码中对您的服务的引用可能为空。
从实用的角度来看,ServiceTracker 是需要编写和维护的大量样板代码。鉴于 OSGi 服务的动态特性,需要考虑 OSGi 规范允许的许多状态。 DS 将为您提供一种干净的方式来声明和维护您的依赖项。定义良好的依赖关系将帮助您保持运行时环境的一致性。
【讨论】:
哪个更好?
创建和使用一些声明式服务非常简单,尤其是使用 Apache Felix SCR 注释和 Apache Felix SCR Maven 插件:
https://felix.apache.org/site/scr-annotations.html
https://felix.apache.org/site/apache-felix-maven-scr-plugin-use.html
【讨论】:
OSGi 服务跟踪器可让您为某些服务注册侦听器,以便您可以在该服务可用时做出反应。
另一方面,声明式服务隐式使用服务跟踪器来延迟捆绑激活代码的执行,直到服务依赖关系得到解决。
【讨论】: