OSGi组件和服务有什么区别?

在OSGi下,组件和服务之间的主要区别是什么? 据我所知,所有的服务必须是组件,但不是所有的组件都必须是服务。

使用示例用例的优点是什么?

“组件”比服务更不正式的定义。

服务是OSGi Service Registry中注册的任何对象 ,可以使用其接口名称进行查找。 唯一的先决条件是一个服务应该实现一些接口…任何接口。 例如,我可以在java.lang.Runnable接口下注册一个可运行的对象,客户端可以使用该接口名称来查找它。

一个“组件”往往是一个对象,其生命周期通常由一个组件框架(如声明式服务(DS),蓝图或iPOJO)来pipe理。 请参阅OSGi社区Wiki上的这个页面 ,了解可用的不同组件框架的讨论。

组件可以具有以下任何组合或单独的特征:

  • 组件可能会启动停止 ; 这将被认为是“积极”的组成部分,尽pipe这也是一个非正式的术语。 不需要启动或停止的组件称为被动组件。
  • 组件可以自己发布为OSGi服务。
  • 组件可以绑定使用 OSGi服务。

一般来说,使用组件框架是使用OSGi服务的最简单的方法,因为框架将pipe理与要使用的服务的绑定。 例如,你可以说你的组件“依赖于”一个特定的服务,在这种情况下,组件只能在服务可用时被创build和激活,并且当服务不可用时它将被销毁。

编辑:请参阅尼尔Bartlett的答案,我已经很具体地回答声明性服务,但它比我在这里说错了更微妙。

简而言之:组件是服务而不是提供者的消费者,服务是组件注册串作为服务提供者的扩展。

组件具有生命周期(取消/激活和修改),服务依赖关系pipe理(取消/绑定)。

服务是组件的扩展; 通过服务registry,它通过发布实现的接口和属性为其他包提供服务。

对于服务的用例是显而易见的,使用组件的典型情况是需要pipe理生命周期,configuration或服务依赖性,但不需要/想要发布组件以用于捆绑软件间使用。