OSGi教程 – 02 – 01 – 使用DS注解来注册服务

2.6 使用编辑器来自动生成Component定义文件

在前面的内容中,我们直接手工编辑了Service Component XML文件,其实在Eclipse中已经提供了编辑工具以便简化Component的编辑工作,下面简要介绍其使用方法(注意,如果你的Eclipse版本过低可能无此功能,你还是需要手工编辑对应文件)。

从指定的工程上选择右键菜单:New->Other->Plug-in Development->Component Definition,如下图:

20161129_001

点击“Next”按钮后,会弹出如下图的Component定义对话框,要求你选择需要定义Component的工程、需要生成Component的类以及xml文件名和所在目录,例如我选择了ServiceBundle中的SayItThreeTimes类及OSGI-INF文件夹,xml文件名默认为component.xml,如下图:

20161129_002

在创建完成后,会看到在ServiceBundle工程的OSGi-INF文件夹下多了一个component.xml文件,同时在MANIFEST.MF文件中的Service-Component条目下,也会自动增加对应的OSGI-INF/component.xml内容。

双击component.xml文件将打开如下图所示的编辑页面:

20161129_003

在Services选项卡中,可以添加对应的Component需要引用的服务和对外提供的服务。

编辑器只是提供了更为便利的编辑功能,这里就不再一一赘述,可参考Source选项卡中的源码以及前文的内容尝试和体验编辑器的功能。

2.7 使用注解自动生成Component定义

从Eclispe4.7版开始,Eclipse支持通过编辑器自动根据注解生成Component定义文件,这种方式比上一节所提到的使用编辑工具的方式更为快捷。

为了启用对应的功能,需要打开菜单:Window –> Preferences–>Plug-in Development–>DS annotations,如下图:

20161129_004

注意确保选项“Generate descriptions from an annotated sources”前面的复选框被勾选。在其下面的各个配置项含义分为为:

● Descriptor directory:产生的Component定义文件的存储目录,默认为OSGI-INF。

● Annotation problem level:注解过程中发生问题的报错等级,默认为Error,一般不需要调整。

● Missing implicit reference unbind method:如果在引用某个服务时没有定义unbind方法的报错等级,默认为Error。尽管DS规范并不强迫要求一定要有一个unbind方法,但是一般强烈建议定义该方法,以避免产生不必要的问题。

● Generate header “Bundle-ActivationPolicy: lazy”:是否自动创建对应的manifest文件条目,默认为勾选,并且如果是使用Equinox作为OSGi框架的话,也必须勾选。

2.8 使用DS注解来注册服务

为了演示对应的功能,我们参考ServiceBundle工程创建一个ServiceBundleAnnotation工程(可以直接复制一份,并注意修改MANIFEST.MF文件中的Bundle名称等定义),并删除

MANIFEST.MF中Service-Component声明和OSGI-INF文件夹中的文件,此时你的工作空间和MANIFEST文件如下图所示:

20161129_005

双击MANIFEST文件后,在打开的窗口的Dependencies选项卡中,在Required Plug-ins列表中增加org.eclipse.osgi.services,如下图所示:

20161129_006

将SayItThreeTimes类的代码修改成如下所示:

保存修改后,你会发现在OSGi-INF文件夹下会自动生成servicebundleannotation.SayItThreeTimes.xml文件,其内容为:

如果你尝试删除代码中的@Component注解并保存源文件后,你会发现OSGi-INF文件夹下的servicebundleannotation.SayItThreeTimes.xml文件也会随之自动删除;同样如果删除@Activate、@Deactivate注解并保存源文件,也会在servicebundleannotation.SayItThreeTimes.xml文件中删除对应的属性。换言之,编辑器通过新增的注解自动生成了Component定义文件,这显然比通过手工或工具一步步产生对应的定义文件来得更为方便。

新增的三个注解含义分别如下:

● @Component:表示对应类是一个对外提供服务的Component。

● @Activate:表示对应的方法在Component被激活时调用。

● @Deactivate:表示对应的方法在Component被钝化时调用。

2.9 使用注解声明一个引用服务的Component

仿照上一节,参考NeedServiceBundle工程创建NeedServiceBundleAnnotation工程,(可以直接复制一份,并注意修改MANIFEST.MF文件中的Bundle名称等定义),并删除MANIFEST.MF中Service-Component声明,删除OSGI-INF文件夹。

将SingASong类的代码修改成如下所示:

同样你会发现Eclipse会自动生成OSGI-INF文件夹以及对应的needservicebundle.SingASong.xml文化,其内容如下所示:

 

新增的@Reference注解表示对应的方法需引用Service,其属性分别与生成的XML文件中对应的属性一致。

@Reference注解的方法就是所引用服务的bind方法,对应的unbind方法则由注解中unbind属性标明。如果方法缺失或方法名有误,则IDE会进行错误提示,如下图:

20161129_007

启动OSGi框架,运行结果应该如下:

20161129_008

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