我现在正在开发 OSGi 服务,我有一个关于在 OSGi 中使用服务的问题。有一些不同的方式来注册用户服务。谁能解释 OSGi 服务跟踪器和声明式服务之间的区别?哪一个更好?
5 回答
在 OSGi 中,ServiceTracker 是一种获取服务引用的编程方式。即,您编写“跟踪”对另一个服务的引用的 ServiceTracker 代码,并让您在它可用时使用它。
相反,声明式服务 (DS) 允许您声明注入到组件中的依赖项。DS 是一种依赖注入的形式。服务之间的依赖关系图以及它们的启动顺序将决定您的服务何时启动。DS 定义中的基数属性允许您声明关系是强制性的 (1..1)、具有至少一个 (1..n) 的多重、可选 (0..1) 还是多重可选 (0..n )。当您声明强制关系时,您的服务将在所有依赖项都满足之前不会启动。当您声明一个可选关系时,无论依赖项的状态如何,您的服务都将启动,但您需要注意代码中对您的服务的引用可能为空。
从实用的角度来看,ServiceTracker 是需要编写和维护的大量样板代码。鉴于 OSGi 服务的动态特性,需要考虑 OSGi 规范允许的许多状态。DS 将为您提供一种干净的方式来声明和维护您的依赖项。定义良好的依赖关系将帮助您保持运行时环境的一致性。
声明式服务 (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 Service Tracker 让您可以为某些服务注册侦听器,这样您就可以在该服务可用时做出反应。
另一方面,声明式服务隐式使用服务跟踪器来延迟捆绑激活代码的执行,直到服务依赖关系得到解决。
哪个更好?
创建和使用一些声明式服务非常简单,尤其是使用 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
所有依赖项都必须安装在带有 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>