OSGi enRoute – 2.1_4 – 练习使用服务

练习使用服务 – 使用一个服务

此时我们犯了一个面向服务的系统中的常见错误;我们将各种功能都混杂在了一起。UpperApplication类的目的在于为其之下的服务建立一个交互界面;但是通过这样的一个界面来提供各种功能是很不好的;它的目的仅仅只是避免外部错误并且将任务分配给底层(未受保护的)服务。

因此在本节中你将会创建一个服务API和一个服务供应者(Provider)。总体来说,本节将会包括如下几个步骤:

● 创建一个API。我们将会创建一个API工程,它会导出一个Upper接口,该接口会将一个字符串转换为大写格式。

● 为Upper服务创建一个Provider。

● 转换UpperApplication类,使之使用Upper服务。

● 将Provider添加到运行Bundle集合中

创建一个API

将API代码与其实现代码隔离开是很重要的。如果你将API和实现代码都存放在一个工程中,很容易将实现代码泄露给其它工程,而它可能仅仅只是需要API。

在OSGi enRoute中,API工程的名称必须以.api结尾,你应该在创建工程时选择OSGi enRoute模板。下面将我们的API工程命名为com.acme.prime.api。为何不将其命名为com.acme.prime.upper.api呢?这是因为我们在为未来打算;我们希望在其它API中重用这个工程。我们可以为每个API创建一个工程,但是这样随着时间推移我们可能会创建上百个几乎为空的工程。由于一个工作空间应该是一个有内聚性的模块,我们在这个API工程中定义的API们也应该具有内聚性。

在这个新工程中,我们将模板API重命名以反映我们的意图。将com.acme.prime.api包重命名为com.acme.prime.upper.api,并且将Prime.java文件重命名为Upper.java。然后改写Upper类,使用它来将一个单词转换为大写格式:

如果将来你有了另外的API,你可以将其添加到此工程的另外一个包中。

创建一个Provider

下面为Upper API创建一个Provider工程。将该工程命名为 com.acme.prime.upper.provider并且使用OSGi enRoute模板。默认情况下此工程是看不到API工程的,因此我们需要添加API工程。可以通过在com.acme.prime.upper.provider工程中双击bnd.bnd文件并且选择Build选项卡来添加它。在此选项卡中,选择+按钮并且添加对应的API工程(双击它们)。这样我们添加了latest版本,这意味着我们使用了工作空间中的版本。

然后我们应该改写UpperImpl类来实现API工程中的Upper接口,因此我们应该导入com.acme.prime.upper.api.Upper。这个类应该已经标记为Component,因此它将会把实现的接口注册为服务。

一般来说,一个Provider Bundle应该导出它所提供的API;在本例中我们提供了com.acme.prime.upper.api 包。导出此包是我们所建议的最佳实践之一,它为后续需要的工作做好了准备。你可以通过选择com.acme.prime.upper.provider  工程,然后选择Contents选项卡中的bnd.bnd文件来导出此包。注意要导入com.acme.prime.upper.api。将此导入包拖放到export列表中然后保存文件。此时import信息会消失。

改变Upper Application

现在我们需要修改UpperApplication类来使用我们强大的新服务。目前它还没有任何依赖,因此我们需要为Upper服务添加依赖。

我们需要做的第一件事是确保API工程对Upper应用可见。因此点击bnd.bnd文件,选择Build选项卡,跟我们在Provider工程中进行的操作一样添加API工程。

然后我们修改UpperApplication组件类。我必须为Upper服务添加一个带有@Reference注解的setter方法,这也意味着我们必须导入org.osgi.service.component.annotations.Reference。现在我们可以将Reference添加到类的末尾(编码规范是将Reference放到末尾):

@Reference注解创建了一个对此服务的依赖;只有服务注册表中包含了Upper服务,UpperApplication 组件才会被启动。

下一步是通过getUpper方法来使用upper实例变量(因此我们必须再次导入com.acme.prime.upper.api.Upper)。

如果OSGi框架仍在运行中,你可能会看到错误信息,因为此时在代码中我们有一个未被解析(Unresolved)的服务;我们引用了com.acme.prime.upper.api包,但此时它还没有被提供。

将Provider添加到Run Bundles集合中

我们已经改变了依赖包,因此需要重新解析(Re-Resolve)我们的组件。因此进到com.acme.prime.upper.application工程之中并双击选择com.acme.prime.upper.bndrun 文件,选择Run选项卡。点击Resolve按钮然后确保com.acme.prime.upper.provider已经被添加了。保存 com.acme.prime.upper.bndrun文件。这将会在运行着的框架中自动部署Bundle。可以通过刷新浏览器来检查框架是否仍在运行!如果没有运行的话你就需要开始进行调试工作啦:-)

打赏一下
支付宝
微信
除非注明,博客文章均为原创,转载请标明文章地址
本文地址: http://www.javafxchina.net/blog/2017/08/osgi-enroute-0201-04/
百度已收录