私は現在、コードの一部をプレーンJavaコードからOSGi宣言型サービスに変換しています。
元のプレーンJavaコード
new AggregateServiceImpl(
new ChildServiceImpl1(),
new ChildServiceImpl2(),
new ChildServiceImpl3()
);
クラスは次のように宣言されます。
class AggregateServiceImpl implements Service
class ChildServiceImpl1 implements Service
class ChildServiceImpl2 implements Service
class ChildServiceImpl3 implements Service
したがって、すべてのクラスはServiceを実装しますが、Aggregate実装は、必要に応じて子Servicesに延期することができます。
AggregateServiceImpl自体は、他の実装の存在を認識していません。そのコンストラクターは元々次のように宣言されています。
public class AggregateServiceImpl(Service... children)
明確化:インターフェース名「サービス」は一般的に意図されており、OSGiDSまたはサービスの概念を表すことを意図していません。
OSGiへの変換
まず、各実装を独自のバンドルに移動します。次に、コンポーネント(サービス実装)を宣言します。私はたまたまbndを使用しているので、サービスアノテーションを使用します。例えば:
@Component
class ChildServiceImpl1 implements Service
クライアントクラスでは、低レベルのOSGi APIを使用してサービスを検索するか、そのバンドル内のDSを使用してオブジェクトを作成できます。
問題
「サービス」を検索する最良の方法は何ですか?AggregateServiceImplが必要ですが、ChildServiceImplの1つを受け取る可能性があります。
別のサービスタイプを使用するか、コンポーネントの1つ(「isRootService」など)にプロパティを追加して、ServiceReferencesを検索するときにフィルターとして使用するのが最善ですか?