0

私が見たすべての iPOJO の例では、@Bindおよび@Unbindコールバックは引数としてサービス インスタンスのみを取ります。

// @Requires
// private Foo foo;

@Bind
public void bindFoo(Foo foo) { ... }

@Unbind
public void unbindFoo(Foo foo) { ... }

ブループリントでは、

public void bindFoo(ServiceReference reference) { ... }

public void bindFoo(Foo foo, Map<String, Object> properties) { ... }

iPOJO コールバックは、サービス プロパティまたは へのアクセスも取得できますかServiceReference? または、代わりにホワイトボードハンドラーを使用する必要がありますか?

4

1 に答える 1

1

コールバックには、次のいずれかの署名を付けることができます。

  1. 引数なし:メソッドは単なる通知です(method())
  2. サービスオブジェクトの場合:オブジェクトは関連するサービスオブジェクトです(method(Service svc))
  3. OSGiサービス参照の場合:サービス参照の表示または非表示(method(ServiceReference ref))
  4. サービスオブジェクトとOSGiサービスリファレンス(method(Service svc、ServiceReference ref))を使用
  5. マップ内のサービスオブジェクトとサービスプロパティを使用(method(Service svc、Mapプロパティ))
  6. ディクショナリ内のサービスオブジェクトとサービスプロパティを使用(method(Service svc、ディクショナリプロパティ))

したがって、サポートされています:

@Bind
public void bind() { ... }

@Bind
public void bind(Service svc) { ... }

@Bind
public void bind(ServiceReference ref) { ... }

@Bind
public void bind(Service svc, ServiceReference ref) { ... }

@Bind
public void bind(Service svc, Map properties) { ... }

@Bind
public void bind(Service svc, Dictionary properties) { ... }

したがって、サービスプロパティにアクセスするのに問題はありません。本当にServiceReferenceが必要な場合を除いて、このOSGi固有のオブジェクトを使用しない方がおそらく良いでしょう(テスト容易性を減らします)。

于 2012-05-03T12:19:31.447 に答える