OSGi组件和服务之间的区别是什么

OSGi组件和服务之间的区别是什么,osgi,Osgi,在OSGi下,组件和服务之间的主要区别是什么? 据我所知,所有服务都必须是组件,但并非所有组件都必须是服务 在示例用例中使用一个比另一个有什么好处?编辑:参见Neil Bartlett的回答,我已经非常明确地回答了wrt声明性服务,但它比我在这里错误地陈述的更微妙。 简而言之:组件是服务的消费者而不是提供者,服务是注册为服务提供者的组件的扩展 组件具有生命周期(取消/激活和修改)、服务依赖关系管理(取消/绑定) 服务是组件的扩展;通过服务注册中心,它通过发布实现的接口和属性向其他捆绑包等提供服务

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


在示例用例中使用一个比另一个有什么好处?

编辑:参见Neil Bartlett的回答,我已经非常明确地回答了wrt声明性服务,但它比我在这里错误地陈述的更微妙。

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

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

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

服务的使用案例显而易见,使用组件的典型案例是需要管理生命周期、配置或服务依赖关系,但不需要/希望发布组件以供捆绑包间使用。

“组件”的定义不如服务正式

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

“组件”往往是其生命周期由组件框架(如声明性服务(DS)、Blueprint或iPOJO)管理的对象。有关可用的不同组件框架的讨论,请参见OSGi社区Wiki上的

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

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

通常,使用组件框架是使用OSGi服务的最简单方法,因为该框架将管理与您想要使用的服务的绑定。例如,您可以说您的组件“依赖于”某个特定的服务,在这种情况下,只有当该服务可用时才会创建和激活该组件,而且当该服务不可用时,该组件也会被销毁。

我不同意“组件不是提供者”。组件可以是服务的使用者或提供者,或者两者兼而有之,或者两者都不是。如果您仅限于组件的DS定义,则这是正确的。在Blueprint和其他框架中,组件可以使用或连接到同一捆绑包中的其他组件,而无需发布服务。但我认为这并不相关:你可以有一个组件是服务,一个组件不是服务,另一个组件不是组件……啊,我明白了(我纯粹是从DS的角度看的)。因此,服务不一定是组件(例如远程服务)。我会编辑我的帖子并给你打分(这不会让我给自己打分)。@Neil-你提到“通过直接在
BundleActivator
中实例化并向
registerService
注册,以老式的方式创建服务”。我是OSGi新手,这是我知道的创建服务的唯一方法。新方法是什么?@axiopisty Declarative Services。您能提供一个非服务组件的示例吗?@santiagozky,当然可以。假设您想要编写一个位于套接字上并通过TCP/IP响应请求的服务器组件。当组件启动时,它打开套接字并创建为客户端服务所需的线程。当它停止时,它关闭线程和套接字。另一个示例:使用Swing、SWT或JavaFX创建GUI的组件。这些示例组件本身都不是服务,尽管它们可能使用由其他组件发布的服务。@santiagozky顺便说一句。。。如果您仔细想想,您的应用程序中总是至少需要一个“活动”组件。如果所有组件都只是坐在那里向其他组件提供服务,那么您的应用程序实际上什么都不做;-)