web-dev-qa-db-ja.com

OSGiバンドルコンテキストを取得するための最良の方法は?

私のOSGiプロジェクトの各バンドルには、独自のBundleActivatorがありますが、これは正常だと思います。これには現在のBundleContextが渡されます。これは、サービス参照などを取得するのに便利です。

ただし、バンドル内のクラスから、BundleContextを取得するにはどうすればよいですか? BundleActivatorのpublic staticフィールドにそれを割り当てるのは面倒で、引数として渡すことも面倒です。もっと賢い方法はありますか?

35
xconspirisist

FrameworkUtil.getBundle(ClassFromBundle).getBundleContext()を使用できます。

FrameworkUtil JavaDoc を参照してください。

51
Ivan Dubrov

私の意見では、OSGiバンドルを開発する際のベストプラクティスは、OSGi関連のコードをできるだけ一元化して書くことです。このようにして、OSGi以外の環境でコードを使用する場合、移行作業は最小限に抑えられます。

したがって、静的参照またはFrameworkUtilをあちこちで使用するのは良い考えではありません。どちらもプレーンOSGiを使用していません。 iPOJOまたは宣言型サービスを見てみてください。

17
RaduK

別の方法は、宣言サービスを使用することです。これにより、アクティベーターメソッドにBundleContextを受け取ることができます。たとえば、DSにBndアノテーションを使用するとします:

@Activate
public void activate(BundleContext context) {
    // ...
}

ただし、RaduKが言ったように、BundleContextなどのOSGi APIを使用せずに、ほとんどのコードをPOJOスタイルで記述できれば、はるかに優れています。

11
Neil Bartlett