1

ここで春の初心者。

バンドルの1つに次のように定義されたosgiサービスがあります。

<osgi:service id="myModelInterpreter" ref="myModelInterpreterService" interface="*.IModelInterpreter" />

別のバンドルからBundleContextdoing getServiceReference(passing down IModelInterpreter.class.getName)を介してアクセスできることはわかっていgetServiceます。

IModelInterpreter.class.getNameインターフェイス(として渡される)を使用する代わりに、ID(myModelInterpreter)を介してサービスを取得する方法はありgetServiceReferenceますか?

助けていただければ幸いです。

4

3 に答える 3

2

これはSpringコンテキストの内部設定であるため、springconfigで指定したIDでサービスを取得できるとは思いません。あなたができることは、サービスにいくつかのサービスプロパティを追加し、それらをフィルタリングすることです。

このような:

<service ref="myModelInterpreterService" interface="*.IModelInterpreter">
  <service-properties>
    <beans:entry key="myId" value="myModelInterpreter"/>
  </service-properties>
</service>

次に、他のバンドルで、プロパティをフィルタリングできます。

<reference id="myModelInterpreterService" interface="com.xyz.IModelInterpreter"
  filter="(myId=myModelInterpreter)"/>
于 2012-10-13T07:35:24.690 に答える
1

すでにSpringDMを使用してサービスを宣言しているので、それを使用する最も簡単な方法は、別のdm構成で同じことを行うことです。

<osgi:reference id="modelInterpreter" interface="IModelInterpreter" />

これは、特定のSpringBeanにフィルタリングするためにこのように表すこともできます。

<osgi:reference id="modelInterpreter" bean-name="myModelInterpreter" interface="IModelInterpreter" />

次に、コンシューマーバンドルの通常のSpring構成でbean "modelInterpreterを使用します。これと同じ行は、bean-nameを使用しても実行できますが、interfaceまたはinterfaces属性が必要になると確信しています。 OSGiサービスを検索する唯一の受け入れられた手段。bean-nameを使用すると、サービス検索でのプロパティフィルターの使用が単純にシュガーコートされますが、実際にはバンドル間の依存関係がより緊密になるため、ほとんどの場合、これは望ましくありません。たとえば、このような緊密な結合なしで依存関係を模倣する方が簡単です。

一方、DMを使用せずにサービスにアクセスしたい場合は、レジストリへの直接アクセス(コード経由)またはDS(宣言型サービス)を使用した注入のいずれかを使用して、OSGiのストレートアップ方法を使用することをお勧めします。 )。

私は通常のSpringを使用してOSGiサービスに直接アクセスすることは避けたいと思います。Springを使用してバンドル内でのみ構成を行い、SpringDMを使用してバンドル間の依存関係を外部化します。

于 2012-10-12T18:56:01.523 に答える
-2

または単に使用する

Object obj = beanFactory.createBean(YourClass.class);
于 2012-10-12T14:07:29.787 に答える