Declarative services

http://www.ibm.com/developerworks/cn/opensource/os-ecl-osgids/index.html

1、Declarative Services

Declarative Services 是一个面向服务的组件模型,它制订的目的是更方便地在 OSGi 服务平台上发布、查找、绑定服务,对服务进行动态管理,如监控服务状态以及解决服务之间的复杂的依赖关系等问题。Declarative Services 采用服务组件的延迟加载以及组件生命周期管理的方式来控制对于内存的占用以及启动的快速,很好的解决了传统的 OSGi 服务模型在开发和部署比较复杂应用时内存占用大、启动慢等问题,并且对服务组件的描述采用XML来实现,十分便于用户理解和使用。在 Declarative Services 中,Component 可以是 Service 的提供者和引用者,一个 Component 可以提供 0 至多个 Service,也可以引用 0 至多个 Service,并且采用component 方式封装 Service,方便了对 Service 的复用,从开发者的角度来看,该服务组件模型简化了在 OSGi 服务平台中的编程模型。

 

Service 的发布、查找、绑定

在 OSGi 服务平台中,大部分 Bundle 应用都是基于服务的,服务的发布、引用十分重要,下面讲一下利用服务组件如何进行 Service 的发布、查找和绑定。

Service 的发布

对于 Component 中 Service 的发布,需要在组件配置文件中定义 service 元素,该 service元素至少包括一个或多个 provide 元素,该 provide 元素定义了该 component 提供的服务接口,它只有一个属性 interface,该 interface 定义了提供服务的接口,并且允许是实现该服务接口的类名。可以看出,利用 Declarative Services 发布 Service 非常简单,只要 Component 实现了定义的 Service 的接口即可。如在本文所讲解例子中,在组件配置文件中,声明姓名查询服务如图 4 所示:


图示4:姓名查询服务声明
图示4:姓名查询服务声明

Service 的查找和绑定

在 Declarative Services 中,Component 所引用的服务称为 Target Service,当 Component 中引用的 Target Service 也是 Satisfied 时,即引用的 Service 至少有一个是处于可用状态的,或者引用的 Service 在服务组件配置文件里配置了可为 0 个可用状态的 Service,组件配置才有可能被激活。在组件实现类中,有两种策略可以获得在组件配置文件里指定的 Target Service,是事件策略和 Lookup 策略

事件策略

在服务组件激活的过程中,SCR 必须将组件配置文件里指定的 Target Service 绑定到组件配置中。在事件策略中,SCR 通过调用组件实现类的一个方法将 Target Service 绑定到组件中,同样,SCR 通过调用另外一个方法来取消绑定,这些方法在组件配置文件中 reference 元素的bind 和 unbind 属性指定。事件策略主要适用于服务组件所引用的 Target Service 处在动态变化中。如在本文例子中,如果采用事件策略引用姓名查询服务,在配置文件中声明和 Component 实现类中引用服务分别如图示 5、图示 6 所示:


图示5:采用事件策略的组件配置文件
图示5:采用事件策略的组件配置文件

图示 6:采用事件策略的绑定姓名查询服务
图示 6:采用事件策略的绑定姓名查询服务

Lookup 策略

在组件实现类中,通过调用 ComponentContext 的 locateService 方法来定位所引用的 Target Service ,该方法的参数是在组件配置文件里指定的 reference 元素的 name 属性。如在本文例子中,如果采用 Lookup 策略引用姓名查询服务,在配置文件中声明和 Component实现类中引用服务分别如图示 7、图示 8 所示:


图示7:采用 Lookup 策略的组件配置文件
图示7:采用 Lookup 策略的组件配置文件

图示 8:采用 Lookup 策略的引用姓名查询服务
图示 8:采用 Lookup 策略的引用姓名查询服务

在 OSGi 服务平台中,即便 Component 已经绑定所引用的 Target Service,但是由于服务的动态性,它可能在任何时刻被注册、替换或者注销,这些变化可能使服务组件所引用的 Target Service 变成过时的引用,所以,在 Declarative Services 中,当这些情况发生时,Component必须采取某种策略去处理这些变化。Declarative Services 提供两种策略,一种是 static 策略 ,另外一种是 dynamic 策略 ,默认情况下 Component 采用的是 static 策略。当采用static 策略时,如果引用的 Target Service 发生了变化,那么组件配置会被重新装载并激活。当采用 dynamic 策略时,SCR 在不钝化组件配置的情况下可以改变绑定的 Target Service。此外,Declarative Services 还提供很多功能,如可通过在 Component 的 reference 元素中增加 target 属性来实现对所引用 Service 进行过滤;如可增加 cardinality 属性来对引用 Service 的数量进行控制。关于 Declarative Services 更详细的信息,请读者参见本文的参考资料。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值