这里需要覆写在BobSays Bundle 中的Activator 的两个方法,具体代码如下:
public class Activator implements BundleActivator { private ServiceRegistration serviceReg = null;
public void stop(BundleContext context) throws Exception { |
完成的主要功能是:1、在启动服务的时候,注册BoySays 服务为一个SayHello 服务;2、在停止服务的时候,从上下文中卸载该服务。
类似的创建KentSays、RodSays 两个project。
最后,创建一个名为SayHelloService 的plug-in project。笔者设置的包为org.osgi.demo.service,同样在配置dependencies 的时候,将包org.osgi.demo.say 引入。创建SayHelloService类,代码如下:
public class SayHelloService { private SayHello say; public void helloWorld() { public void setSay(SayHello say) { |
这里采用依赖注入的方式,所以有一个setSay() 方法,来设置一个具体的SayHello。helloWorld() 方法就是调用特定的SayHello.sayHello() 来完成的,用10秒钟的时间打印十次sayHello() 的具体内容。该Bundle 的Activator 代码如下:
public class Activator implements BundleActivator { private ServiceRegistration serviceReg = null; public void start(BundleContext context) throws Exception {
|
完成的主要功能是:1、注册SayHelloService 服务;2、获取一个的SayHello 服务;3、并注入到SayHelloService 服务中,现在注入的服务是从服务上下文中具体获取的,而到底是哪个,只有在运行时状态才能决定。
至此,所有的Bundles 我们都已经完成了,选择Open Run Dialog...,并选中上述五个Bundles 和OSGi 核心Bundle,点击Run 按钮。输入“ss”,列出了6个Bundles 的状态,此时,如果你的SayHelloService Bundle 状态是Resolved,那么你可以通过命令“start ‘SayHelloService Bundle 状态的id’”,启动SayHelloService,此时你会看到打印出的10条hello world信息。读者可以手动利用用命令“start” 和“stop” 改变sayHello 的具体执行者,动态的更换实际sayHello 的执行者。这个简单的HelloWorld 应用,可以说明SayHelloService 在具体执行的过程中行为是可动态改变的,并且改变只是局部的。
小结
读完本文,实际动手做过HelloWorld,想必读者对OSGi 框架也应该有所了解了,OSGi 框架在国外关注率是挺高的,但是在国内的推广和使用却不够广泛,可能是因为OSGi 字面上的意思太过于抽象,因此笔者在这里将这个优秀的框架介绍给大家,本片只是一个简单的介绍,并不涉及OSGi 框架深入的知识。