我是OSGi
的新手并且已经研究了一段时间。
我想知道 ServiceTracker, ServiceReference & ServiceReferences
的使用和优势的主要差异。
我使用ServiceTracker
和& ServiceReference
如果该服务不可用,则返回NULL
。但是,如果该服务可用,那么两者都可以正常工作,但我无法观察到两者之间的区别。
我在某处读到 ServiceTracker
是一种获取服务引用的编程方式。即写ServiceTracker
代码“跟踪”对另一项服务的引用,并让它在可用时使用它。但在实际操作中我无法看到它是如何完成的!
任何人都可以解释一下吗? 谢谢。
答案 0 :(得分:4)
我建议您不要使用!
ServiceReference
只代表OSGi服务注册表中的一个条目。您可能意味着使用BundleContext.getServiceReference()
等API调用来访问服务。这是使用OSGi服务的最低级别,因为您可能已经注意到它非常复杂,并且它将您的代码与OSGi API相结合。
ServiceTracker
的级别略高,它包含了较低级别的调用。关键优势在于它会在服务消失时通知您,这非常重要,因为服务是动态的。但是ServiceTracker
仍然是非常低级的,它仍然将您的代码耦合到OSGi API。
我强烈建议您避免使用最低级API(基于ServiceReference
)和ServiceTracker
,直到您获得更多OSGi经验。
作为替代方案,我建议学习声明式服务。这为您提供了基于依赖注入的编程模型,并将您与OSGi API分离。它更容易和更安全!您可以从以下教程开始:http://bndtools.org/tutorial.html
答案 1 :(得分:0)
我同意尼尔所说的话,但我需要延伸回答你的评论:
如果您想使用Maven使用声明性服务构建项目,则必须使用maven-bundle-plugin
和maven-scr-plugin
。前者使用 bnd ,而后者处理您的DS注释。例如:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.3.7</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-Name>${project.name}</Bundle-Name>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Export-Package>${project.artifactId}.api</Export-Package>
</instructions>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-scr-plugin</artifactId>
<version>1.9.0</version>
<executions>
<execution>
<id>generate-scr-scrdescriptor</id>
<goals>
<goal>scr</goal>
</goals>
</execution>
</executions>
</plugin>
在这个例子中(在build
部分中)我指示maven-bundle-plugin
导出我${project.artifactId}.api
目录中的所有包(这是我的OSGi项目中的约定)和maven-scr-plugin
根据我的Apache Felix声明性服务注释生成xml cofiguration。
我建议您阅读Apache Felix声明性服务注释及其工作原理,因为从长远来看它会对您有所帮助。
我有一个示例OSGi应用程序,您可以查看:here