2011-11-30 14 views
5

Spring-Context MANIFEST definitionsを使用して、component-scanを実行して、Spring注釈付きBeanのパッケージを検索しようとしています。私のSpringのXML設定は次のようになります。OSGiのSpringコンポーネントスキャンで何も見つからない

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
     http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"> 

    <!-- Scans the classpath of this application for @Components to deploy as 
     beans --> 
    <context:component-scan 
     base-package="com.some.other.module.one,com.another.module.two" /> 

    <context:annotation-config /> 
.... 

</beans> 

MANIFESTでは、クラスを含むパッケージをSpringアノテーションでインポートします。しかし、ApplicationContextを調べると、その中に注釈付きBeanはありません。

私たちがスキャンしているクラスパスが異なるバンドルにあるので、これが起こっていると思います。これらのバンドルは、Springアノテーションを持つクラスを持つパッケージを直接インポートすることはありません。混乱しているのは、Springがコンポーネントスキャンが開始されたメインバンドルのクラスパスを取得しない理由です。クラスパススキャンを実行しているときに、各バンドルのクラスパスを使用しているかのようです。スキャンが始まるクラスパスのクラスパスをクラスパススキャンで使用する方法はありますか?

編集

Danail Nachevは周りの仕事を使用することです春はクラスパスのスキャンを行うとき、それが唯一のクラスパスがで起こっているモジュール内で起こる、以下の言ったように:

  1. 。モジュールごとの設定をSpring 3 @Configuration beanに入れてください。
  2. @Configuration beanを初期化するXMLファイルを最上位バンドルに使用します。
  3. 最上位レベル@Configurationでは@Importを使用して他の構成ファイルをインポートします。
  4. MANIFESTのRequire-Bundleに、インポートする設定が使用可能であることを確認してください。

答えて

7

OSGiはすべてモジュール化されているので、バンドル間を明確に分離することができます。 Springが単一のApplicationContextの下でそれらを統合することができるなら、すべてが単一のクラスパスで利用可能である通常のSpringアプリケーションと変わらないでしょう。このようなもの。

どうしたのは、各バンドルが独自のApplicationContextを受け取ることです。これらのApplicationContextは、OSGi Service Registryを使用してBeanを交換できます。 Beanをエクスポートしてマークし、他のApplicationContextにインポートする必要があります。そうでない場合、Beanは互いに見えません。

これは、単一のSpringコンテキストですべてを構成することができない理由を説明し、1つのバンドルから開始してすべてのBeanを見つけることを期待する必要があります。 Springコンテキストはシングルバンドルのみをスキャンし、オプションでOSGiサービスとしてBeanをインポート/エクスポートできます。ここから解釈

Chapter 8. Packaging and Deploying Spring-based OSGi applications

+0

はそれが正確に観察された行動だ、ありがとう。クラスパススキャンを使用せずに回避策を見つけることができました。 –

関連する問題