我正在研究OSGi服务,我对在OSGi中使用服务有疑问。注册用户服务有一些不同的方式。谁能解释OSGi服务跟踪器和声明服务之间的区别?哪一个更好?
答案 0 :(得分:14)
在OSGi中,ServiceTracker是一种获取服务引用的编程方式。即你编写ServiceTracker代码,“跟踪”对另一项服务的引用,让你在它可用时使用它。
相比之下,Declarative Services(DS)允许您声明注入组件的依赖项。因此,DS是一种依赖注入形式。服务之间的依赖关系图及其启动顺序将决定您的服务何时启动。 DS定义中的基数属性允许您声明关系是否是必需的(1..1),多个具有至少一个(1..n),可选(0..1)或多个可选(0..n) )。 声明强制关系时,在满足所有依赖关系之前,您的服务将无法启动。 当您声明可选关系时,无论依赖关系的状态如何,您的服务都将启动,但您需要注意代码中对服务的引用可能为null。
从实际角度来看,ServiceTracker是很多编写和维护的样板代码。鉴于OSGi服务的动态特性,OSGi规范允许的许多状态需要加以考虑。 DS将为您提供一种声明和维护依赖项的简洁方法。定义良好的依赖项将帮助您保持运行时环境的一致性。
答案 1 :(得分:4)
声明性服务(DS)非常易于使用,您可以避免使用与ServiceTracker相关的一些样板代码。如果你只使用ServiceTracker进行简单的OSGI,你需要处理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就像Spring for OSGI。
答案 2 :(得分:3)
OSGi服务跟踪器允许您为某些服务注册侦听器,以便您可以在该服务可用时做出反应。
另一方面,声明服务隐式使用服务跟踪器来延迟捆绑激活码的执行,直到解决了服务依赖性为止。答案 3 :(得分:0)
哪一个更好?
创建和使用一些声明式服务非常简单,特别是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
答案 4 :(得分:0)
必须在带有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>