0

依存関係フレームワーク Guice を使用してアプリケーションを構築しました。今度は OSGI に移り、バンドル情報を使用して jar を拡張し始めます。

私が現在直面している主な問題は、依存性注入を正しく設定する方法です。いくつかのパッケージをエクスポートするバンドル A があります。次に、バンドル B がコンポーネントを定義します。このコンポーネントには、バンドル A のオブジェクト (クラス AA) が注入される必要があります。

自動的に注入されるバンドル A のクラス AA のサービスをセットアップできますが、バンドル A がエクスポートされない可能性があるバンドル A のクラスにも依存している場合はどうなるでしょうか。エクスポートされていないため、2番目のクラスをサービスとして設定する必要がありますか?これは機能しません。

次のコードは問題を示します。

バンドル A

package test.bundleA.api

public class AA {

   @Inject
   public AA(AInternal someReference) {...}
}




package test.bundleA.internal

public class AInternal {...}

バンドル B:

package test.bundleB.api

public class ComponentB {

   @Inject
   public ComponentB(AA refToA) {...}
}

エクスポートされたパッケージのバンドル A で他のクラスを使用する場合、それぞれにサービスを設定する必要がありますか?

バンドル内およびバンドル境界を越えた依存性注入の問題を解決するための一般的なアプローチは何ですか?

4

2 に答える 2

2

Guice を使用しない場合は、Eclipse+Bndtools を使用して OSGi バンドルを作成することをお勧めします。Bndtools を使用すると、OSGi バンドルを簡単に作成したり、アノテーションを介して DI を作成したりできます。例を見てみましょう:

bundleA にインターフェイスがあります。

public interface Greeting {
   String sayHello(String name);
}

@Componentバンドルが OSGi Declarative Service を使用できるようにするbundleB の実装。

@Component
public class ExampleComponent implements Greeting {
    public String sayHello(String name) {
        return "Hello " + name;
    }
}

最後に、3 番目の bundleC で、DI を行い、すべてのGreeting実装を特定のコンポーネントに注入して使用します。

@Component
public class GreetingCommand {
    private Greeting greetingSvc;

    @Reference
    public void setGreeting(Greeting greetingSvc) {
        this.greetingSvc = greetingSvc;
    }

    public void greet(String name) {
        System.out.println(greetingSvc.sayHello(name));
    }
}

ご覧のとおり@Reference、インターフェイスの実装を注入することを示していGreetingます。上記の例では、OSGi Declarative Services を Bndtools と組み合わせて使用​​しています。Bndtools 自体が注釈を取得し、OSGi が Declarative Services を使用するために必要な XML ファイルを作成します。これ以上深入りしたくない。詳細については、[1] と [2] を参照してください。宣言型サービスと Bndtools を使用して DI を作成する方法をお見せしたかっただけです。

[1] http://bndtools.org/

[2] http://wiki.osgi.org/wiki/Declarative_Services

于 2013-08-22T11:03:40.537 に答える