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

43

在OSGi中,组件(Components)与服务(Services)之间的主要区别是什么? 据我所知,所有的服务必须是组件,但不是所有的组件都必须是服务。

在示例用例中,使用其中一个相较于另一个有什么好处?

2个回答

64
“组件”比“服务”定义得不太正式。
“服务”是指任何在OSGi服务注册表中注册并可以使用其接口名称查找的对象。唯一的前提条件是服务应该实现某些接口... 任何接口都可以。例如,我可以在“java.lang.Runnable”接口下注册可运行对象,客户端可以使用该接口名称进行查找。
“组件”往往是一个对象,其生命周期通常由组件框架(如声明式服务(DS),Blueprint或iPOJO)管理。请参考OSGi社区Wiki上的这个页面,了解不同的组件框架的讨论。
一个组件可能具有以下任何特征,组合或单独出现:
  • 组件可以被启动和停止; 这将被认为是“活动”组件,尽管这也是一个非正式术语。不需要启动或停止的组件称为被动组件。
  • 组件可以作为OSGi服务发布自身。
  • 组件可以绑定或消费OSGi服务。
一般来说,使用组件框架是与OSGi服务配合工作最简单的方法,因为该框架将管理您想要使用的服务的绑定。例如,您可以说您的组件“依赖于”特定的服务,这样当该服务可用时,组件将被创建和激活-并且在服务不可用的情况下,它将被销毁。

1
你能提供一个不是服务的组件的例子吗? - santiagozky
9
好的。假设您想编写一个服务器组件,该组件坐在套接字上并通过TCP/IP响应请求。当组件启动时,它打开套接字并创建所需的线程来为客户端提供服务。当它停止时,它关闭线程和套接字。另一个例子是:一个使用Swing、SWT或JavaFX创建GUI的组件。这两个示例组件本身不是服务,但它们可以使用其他组件发布的服务。 - Neil Bartlett
5
顺便说一下,如果你想一想,你的应用程序总是需要至少一个这样的“活动”组件。如果所有的组件都只是坐着为其他组件提供服务,那么你的应用程序实际上并没有做任何事情。;-) - Neil Bartlett

7

编辑: 参见Neil Bartlett的答案,我针对声明式服务进行了相当具体的回答,但比我在此错误陈述的更为微妙。

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

组件有一个生命周期(de/activate和modify),服务依赖管理(un/bind)。

服务是组件的扩展;通过服务注册表,它通过发布实现的接口和属性向其他捆绑包等提供其服务。

使用服务的用例很明显,使用组件的典型情况是需要管理生命周期、配置或服务依赖关系,但不需要/不想将组件发布到捆绑包内部以供使用。


3
我不同意“组件不是提供者”的说法。一个组件可以是服务的消费者、提供者,或者两者都是,也可能两者都不是。 - Neil Bartlett
4
如果你限制自己使用DS定义的组件,这是正确的。在Blueprint和其他框架中,组件可以在同一束中消耗或连接到其他组件,而无需发布服务。虽然我认为这并不重要:你可以拥有作为服务的组件、不是服务的组件以及不是组件的服务... - Neil Bartlett
1
啊,我明白了(我之前只是从数据结构的角度来看待这个问题)。所以一个服务并不一定是一个组件(例如远程服务)。我会编辑我的帖子并给你点赞(系统不允许我给自己点踩)。 - earcam
1
@Neil - 你提到了“通过直接在BundleActivator中实例化并使用registerService注册来创建服务的老式方法”。我对OSGi还很陌生,这是我所知道的唯一创建服务的方式。那么新的方式是什么? - axiopisty
3
声明式服务。 - Neil Bartlett
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接