3

ブループリント(Aries)を使用して実行時に依存関係を解決したい場合があり、実装はそれを必要とする同じバンドルで定義されており、他のバンドルでは使用されません。単体テスト時に依存関係を簡単にモックできるように、このバンドル内の実装を抽象化しています。このサービスを独自のバンドルに入れると、まとまりが悪くなります。

実行時に、ブループリントは依存関係を待機していると言います。ブループリントを使用して、バンドル内の依存性注入を実現するにはどうすればよいですか?

<!-- Interface -->
<reference id="modelEntityMapper" interface="org.example.blog.rest.cxf.server.model.ModelEntityMapper" />
<!-- Implementation defined within same bundle -->
<bean id="modelEntityMapperImpl" class="org.example.blog.rest.cxf.server.model.impl.ModelEntityMapperImpl" />
<service ref="modelEntityMapperImpl" interface="org.example.blog.rest.cxf.server.model.ModelEntityMapper" />

<!-- Object which has dependency -->
<bean id="posts" class="org.example.blog.rest.cxf.server.BlogResourceImpl">
        <property name="modelEntityMapper" ref="modelEntityMapper" />
</bean>

編集

@ christian-scheiderからの提案を試しましたが、BlueprintはまだModelEntityMapperを満たすサービスを待っています

XML

<!-- Interface -->
<reference id="modelEntityMapper" interface="org.example.blog.rest.cxf.server.model.ModelEntityMapper" />
<!-- Implementation defined within same bundle -->
<bean id="modelEntityMapperImpl" class="org.example.blog.rest.cxf.server.model.impl.ModelEntityMapperImpl" />

<!-- Object which has dependency -->
<bean id="posts" class="org.example.blog.rest.cxf.server.BlogResourceImpl">
        <property name="modelEntityMapper" ref="modelEntityMapperImpl" />
</bean>

ログ

Bundle rest-cxf-server is waiting for dependencies [(objectClass=org.example.blog.rest.cxf.server.model.ModelEntityMapper)]

4

2 に答える 2

3

サービスのBeanを直接参照できますか?同じブループリントファイルでサービスとサービス参照を定義する場合、OSGiサービスを使用することはあまり意味がありません。

于 2013-01-09T09:16:41.187 に答える
2

バンドルでの参照に関連する詳細なドキュメントをAriesサイトで見つけることができなかったため、Eclipse Geminiブループリントの実装ドキュメント(以前のSpring Dynamic Modules)を参照します。ドキュメントのセクション9.2.1.1の警告を参照してください。はい、技術的にはこれはそれらの実装に関連していますが、Ariesでも同様の話である可能性が高いと思います。

同じバンドルによってエクスポートされるサービスへの必須の参照を宣言するのはエラーです。この動作により、アプリケーションコンテキストの作成がデッドロックまたはタイムアウトによって失敗する可能性があります。

一言で言えば、通常、OSGiサービスをインポート(参照)するか、同じバンドルでOSGiサービスをエクスポートします。通常、単一のバンドルで両方を実行しようとはしません。

このバンドルでタイプのサービスをエクスポートする場合は、要素ModelEntityMapperとともにエクスポートする必要があります。service他のBeanが同じバンドル内で参照を必要とする場合、それを使用しているのと同じrefように属性を使用します。この場合、reference要素はまったく必要ありませんが、代わりにservice要素を使用します。

ModelEntityMapperこのバンドルの外部でBeanを使用しない場合は、構成でreferenceまたはservice要素を使用する必要はまったくありません。refOSGiサービスとしてエクスポートしなくても、属性で使用できるはずです。基本的には、そのバンドルの内部にあるBeanです。referenceこの場合、要素を完全に削除できるはずです。これにより<bean id="modelEntityMapperImpl" ...、バンドルの内部でBeanが作成され、<property name="modelEntityMapper" ref="modelEntityMapperImpl" />要素はそのBeanをバンドルの内部で使用できるようになります。

可能な場合はOSGiからタイプの参照をインポートするModelEntityMapper場合は、内部で定義されたフォールバックを使用します。これはより複雑になります。必須ではないことを宣言し、referenceその参照を内部で定義されたBeanとともにクラスに注入してから、それらの可用性をチェックするデフォルトのロジックを用意する必要があります。または、インターフェースとは別のバンドルで実装を定義することもできます。

于 2013-01-10T04:18:46.933 に答える