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

emp*_*e29 40 osgi

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

使用样本用例有什么好处?

Nei*_*ett 57

"组件"的定义不如服务.

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

"组件"往往是一个对象,其生命周期通常由声明服务(DS),蓝图或iPOJO等组件框架进行管理.有关可用的不同组件框架的讨论,请参阅OSGi社区Wiki上的此页面.

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

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

通常,使用组件框架是使用OSGi服务的最简单方法,因为该框架将管理对您要使用的服务的绑定.例如,您可以说您的组件"依赖于"特定服务,在这种情况下,只有在该服务可用时才会创建和激活组件 - 并且当服务变得不可用时它也将被销毁.

  • @santiagozky当然.假设您想要一个位于套接字上的写入服务器组件,并通过TCP/IP响应请求.组件启动时,它会打开套接字并创建为客户端提供服务所需的线程.当它停止时,它会关闭线程和套接字.另一个例子:使用Swing,SWT或JavaFX创建GUI的组件.这些示例组件都不是服务本身,尽管它们可能*使用由其他组件发布的*服务. (8认同)
  • @santiagozky顺便说一下......如果你考虑一下,你总是需要在你的应用程序中至少有一个这样的"活动"组件.如果所有组件都只是为其他组件提供服务,那么您的应用程序实际上并没有**做任何事情;-) (5认同)

ear*_*cam 7

编辑:请参阅Neil Bartlett的回答,我已经非常具体地回答了声明服务,但它比我在这里错误地陈述的更加微妙.

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

组件具有生命周期(de/activate和modify),服务依赖关系管理(un/bind).

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

服务的用例很明显,使用组件的典型情况是需要管理生命周期,配置或服务依赖性,但不需要/想要发布组件以进行跨包使用.

  • 如果您将自己限制在组件的DS定义中,那就是如此.在Blueprint和其他框架中,组件可以使用或连接到同一捆绑包中的其他组件而无需发布服务.我不认为这是相关的:你可以拥有一个服务组件,非服务组件和非组件服务.... (4认同)
  • 我不同意"组件不是提供者".组件可以是消费者或服务提供者,或两者兼有,或两者都不是. (3认同)
  • @axiopisty声明服务. (3认同)