OSGiサービスを実装するときがきました。サービスとサービス参照の詳細を確認していない場合は確認してください。ここでは、サービスインターフェイスを実装し、そのタイプのOSGiサービスとして宣言し、他のコンポーネントとのバインドに最適なカスタムサービスを作成します。
サンプルのカスタムサービスCustomServiceImpl
(サンプルモジュールoverriding-service-reference
より)では、サービスインターフェイスSomeService
を実装し、SomeService
サービスタイプのOSGiサービスとして宣言し、さらに既存のサービスに作業を委任します。
カスタムサービスを作成する手順に従って、このサンプルコードを調べます。
@Component(
property = {
"service.ranking:Integer=100"
},
service = SomeService.class
)
public class CustomServiceImpl implements SomeService {
@Override
public String doSomething() {
StringBuilder sb = new StringBuilder();
sb.append(this.getClass().getName());
sb.append(", which delegates to ");
sb.append(_defaultService.doSomething());
return sb.toString();
}
@Reference (
target = "(component.name=override.my.service.reference.service.impl.SomeServiceImpl)"
)
private SomeService _defaultService;
}
カスタムOSGiサービスを作成する手順は次のとおりです。
-
目的のサービスインターフェイスを
実装する
ようにカスタムサービスクラスを作成します。上記の例では、CustomServiceImpl implements SomeService
です。 ステップ5(後述)に、インターフェイスメソッドの実装を示します。 -
クラスを、サービスインターフェイスへの参照に最適なDeclarative Servicesコンポーネントにします。
-
@Component
アノテーションとservice
属性を使用して、クラスをDeclarative Services(DS)コンポーネントにします。これにより、クラスがOSGiサービスレジストリで使用できるOSGiサービスであると宣言されます。上記のサンプルクラスは、サービスタイプSomeService.class
のDSサービスコンポーネントです。 -
service.ranking:Integer
コンポーネントプロパティを使用して、サービスを既存のサービスよりも上位にランク付けします。上記の"service.ranking:Integer=100"
プロパティでは、この例のランキングが100
に設定されています。
-
-
既存のサービス実装を呼び出す場合は、既存のサービスへのDeclarative Services参照を使用するフィールドを宣言します。サービスを調べたときにコピーした
component.name
を使用して、既存のサービスを対象にします。上記の例は、次のように既存のサービスを参照しています。@Reference ( target = "(component.name=override.my.service.reference.service.impl.SomeServiceImpl)" ) private SomeService _defaultService;
このフィールドでは、カスタムサービスで既存のサービスを呼び出すことができます。
-
インターフェイスのメソッドをオーバーライドします。オプションで、既存のサービス実装に作業を委任します(前の手順を参照)。
サンプルのカスタムサービスの
doSomething
メソッドは、元のサービス実装に作業を委任しています。 -
モジュールをデプロイして、カスタムサービスをOSGiランタイムフレームワークに登録します。
実装したサービスタイプを参照し、その参照ポリシーオプションがgreedy
に設定されているコンポーネントは即座にカスタムサービスにバインドされます。既存のサービスにバインドされ、参照ポリシーオプションがreluctant
に設定されているコンポーネントは、新しいサービスを使用するように動的に再構成できます。次で説明します。
関連トピック
OSGi Services and Dependency Injection with Declarative Services