1

私は OSGi と連絡を取り合っていますが、今は少し混乱しています。宣言型サービスと低レベル API の混合を意味するハイブリッド サービス モデルを使用しています。

OSGi-INF/component.xml の下に配置された次のパーツ宣言を検討してください。

<property name="canHandle" type="String" value="Some kind of stuff"/>
<service>
  <provide interface="foo"/>
</service>

そしてもう一つ

<property name="canHandle" type="String" value="Some other Stuff"/>
<service>
  <provide interface="foo"/>
</service>

別のバンドルには、次のようなものがあります。

bar.createSomething(String type){

ServiceReference[] services FrameworkUtil.getBundle(getClass()).getBundleContext()
                .getAllServiceReferences("foo");
for (ServiceReference s : services) {
    if (type.equals(s.getProperty("canHandle")){
        Foo foo = (Foo)FrameworkUtilgetBundle(getClass()).getBundleContext().getService(s);
foo.execute();

簡単に言うと、複数の実装を持つサービス インターフェイスがあり、実行時にプロパティに対して文字列を照合するものを使用しています。では、宣言型サービスのみを使用して、この状況にどのように対処できますか?

Virgo を使用しているので、Spring で可能であれば、これもオプションになります。

4

1 に答える 1

4

<reference>これは、要素のターゲット フィルターを使用して行うことができます。または、bnd アノテーションを使用します。

@Reference(target = "(canHandle=blah)")
public void setFoo(Foo foo) {
    // ...
}

利用可能なサービス インスタンスが複数ある場合でもFoo、フィルター(canHandle=blah)に一致するものだけがコンポーネントに挿入されます。

アップデート

一致する値が静的にわからないことが明確になりました。その場合、静的フィルターは使用できません。ただし、宣言型サービスを使用して、サービス プロパティの値を手動で確認することもできます。次に例を示します。

@Reference(multiple = true, dynamic = true)
public void setFoo(Foo foo, Map<String,Object> serviceProps) {
    if ("value".equals(serviceProps.get("canHandle"))) {
        // ...
    }
}

複数の一致するインスタンスが得られる可能性があることに注意してください。

于 2013-01-14T10:01:20.930 に答える