web-dev-qa-db-ja.com

OSGiコンポーネントとサービスの違いは何ですか

OSGiでは、コンポーネントとサービスの主な違いは何ですか?私が理解しているように、すべてのサービスはコンポーネントでなければなりませんが、すべてのコンポーネントがサービスである必要はありません。

サンプルユースケースで一方を他方より使用することの利点は何ですか?

39
empire29

「コンポーネント」は、サービスよりも正式には定義されていません。

サービスは、OSGi Service Registryに登録されているオブジェクトであり、そのインターフェイス名を使用して検索できます。唯一の前提条件は、サービスが何らかのインターフェースを実装することです...任意のインターフェース。たとえば、Java.lang.Runnableインターフェイスの下で実行可能なオブジェクトを登録し、クライアントはそのインターフェイス名を使用してそれを検索できます。

「コンポーネント」とは、通常、宣言型サービス(DS)、ブループリント、iPOJOなどのコンポーネントフレームワークによってライフサイクルが管理されるオブジェクトのことです。利用可能なさまざまなコンポーネントフレームワークの説明については、OSGi Community Wikiの このページ を参照してください。

コンポーネントは、次の機能のいずれかを組み合わせて、または単独で使用できます。

  • コンポーネントは、startedおよびstopped;これは「アクティブな」コンポーネントと見なされますが、非公式の用語でもあります。起動または停止する必要のないコンポーネントはパッシブと呼ばれます。
  • コンポーネントは、自身をOSGiサービスとしてpublishすることができます。
  • コンポーネントは、OSGiサービスにbindまたはconsumeすることができます。

一般に、フレームワークは消費するサービスへのバインディングを管理するため、コンポーネントフレームワークを使用することがOSGiサービスを操作する最も簡単な方法です。たとえば、コンポーネントは特定のサービスに「依存」していると言えます。その場合、コンポーネントはそのサービスが利用可能な場合にのみ作成およびアクティブ化され、サービスが利用できなくなると破棄されます。

54
Neil Bartlett

編集:ニール・バートレットの回答を参照してください、私は宣言的サービスについて具体的に答えましたが、ここで間違って述べたよりも微妙です

つまり、コンポーネントはプロバイダーではなくサービスのコンシューマーであり、サービスはサービスプロバイダーとしてのコンポーネントの拡張です。

コンポーネントには、ライフサイクル(無効化/アクティブ化および変更)、サービス依存関係管理(バインド解除/バインド)があります。

サービスはコンポーネントの拡張です。サービスレジストリを介して、実装されたインターフェイスとプロパティを公開することにより、他のバンドルなどにサービスを提供します。

サービスのユースケースは明らかです。コンポーネントを使用する一般的なケースでは、ライフサイクル、構成、またはサービスの依存関係の管理が必要ですが、バンドル間使用のためにコンポーネントを公開する必要はありません。

7
earcam