Diff btw ServiceTracker,ServiceReference& ServiceReferences

时间:2013-12-03 09:27:45

标签: java service osgi

我是OSGi的新手并且已经研究了一段时间。

我想知道 ServiceTracker, ServiceReference & ServiceReferences 的使用和优势的主要差异。

我使用ServiceTracker和& ServiceReference如果该服务不可用,则返回NULL。但是,如果该服务可用,那么两者都可以正常工作,但我无法观察到两者之间的区别。

我在某处读到 ServiceTracker是一种获取服务引用的编程方式。即写ServiceTracker代码“跟踪”对另一项服务的引用,并让它在可用时使用它。但在实际操作中我无法看到它是如何完成的!

任何人都可以解释一下吗? 谢谢。

2 个答案:

答案 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-pluginmaven-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