OSGiでは、コンポーネントとサービスの主な違いは何ですか?私が理解しているように、すべてのサービスはコンポーネントでなければなりませんが、すべてのコンポーネントがサービスである必要はありません。
サンプルユースケースで一方を他方より使用することの利点は何ですか?
「コンポーネント」は、サービスよりも正式には定義されていません。
サービスは、OSGi Service Registryに登録されているオブジェクトであり、そのインターフェイス名を使用して検索できます。唯一の前提条件は、サービスが何らかのインターフェースを実装することです...任意のインターフェース。たとえば、Java.lang.Runnable
インターフェイスの下で実行可能なオブジェクトを登録し、クライアントはそのインターフェイス名を使用してそれを検索できます。
「コンポーネント」とは、通常、宣言型サービス(DS)、ブループリント、iPOJOなどのコンポーネントフレームワークによってライフサイクルが管理されるオブジェクトのことです。利用可能なさまざまなコンポーネントフレームワークの説明については、OSGi Community Wikiの このページ を参照してください。
コンポーネントは、次の機能のいずれかを組み合わせて、または単独で使用できます。
一般に、フレームワークは消費するサービスへのバインディングを管理するため、コンポーネントフレームワークを使用することがOSGiサービスを操作する最も簡単な方法です。たとえば、コンポーネントは特定のサービスに「依存」していると言えます。その場合、コンポーネントはそのサービスが利用可能な場合にのみ作成およびアクティブ化され、サービスが利用できなくなると破棄されます。
編集:ニール・バートレットの回答を参照してください、私は宣言的サービスについて具体的に答えましたが、ここで間違って述べたよりも微妙です
つまり、コンポーネントはプロバイダーではなくサービスのコンシューマーであり、サービスはサービスプロバイダーとしてのコンポーネントの拡張です。
コンポーネントには、ライフサイクル(無効化/アクティブ化および変更)、サービス依存関係管理(バインド解除/バインド)があります。
サービスはコンポーネントの拡張です。サービスレジストリを介して、実装されたインターフェイスとプロパティを公開することにより、他のバンドルなどにサービスを提供します。
サービスのユースケースは明らかです。コンポーネントを使用する一般的なケースでは、ライフサイクル、構成、またはサービスの依存関係の管理が必要ですが、バンドル間使用のためにコンポーネントを公開する必要はありません。