2012-04-13 12 views
2

私は実行中のSpring 3 Webアプリケーションがあります。すべてのBeanが正しく注入され、すべてが正常に動作しています(すべてのWebサービスコールが正常に動作しています)。スレッドにSpring Beanを挿入する方法

アプリケーションを拡張しているうちに、開始できるスレッドを追加する必要がありました。&がWebサービス経由で停止しました。

スレッドでは、いくつかのSpring Beanを注入する必要があります。これらのbeensはサービスです(@Serviceで注釈が付けられています)。

<context:component-scan base-package="<package>"> 
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> 
</context:component-scan> 

しかし、私は、彼らは常に(春はそれらを注入しない)「NULL」ですスレッドで(@Resourceを使用して)豆を注入しよう:私のApplicationContextで豆は、コンポーネントスキャンによって検出されています。スレッドは開始されましたが、初期化中に失敗します。

私もコードでのApplicationContextをロードすることによってそれらを注入しようとした:誰がどのようにスレッドで豆を注入するために任意のアイデアを持っています

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:*applicationContext.xml"); 

if(applicationContext.containsBean("BeanName")) { 

     beanObject = (BeanClass) applicationContext.getBean("BeanName"); 

} else { 

    //Exception 
} 

(アプリケーション・コンテキストは「SRC /メイン/リソースの中に位置しています) ?それとも、スレッド内にBeanを挿入することはできないのですか?

ありがとうございました!

+0

[可能な重複](http://stackoverflow.com/a/1377740/248082)。この答えに基づいて、あなたのカスタムクラスは 'Thread'を拡張しています。 – nobeh

答えて

1

スレッドを管理するインフラストラクチャコードからビジネスロジック(サービスに依存するコード)を分離する方がよいでしょう。

たとえば、Runnableを実装しているビジネスロジックを宣言してから、Threadを開始する必要がある場合に使用することができます。

しかし、手作業でThreadを起動することも良い方法ではありません。代わりにスレッドプールを使用する方がよいでしょう。実際には、Springには、スレッドプールと非同期実行の組み込みサポートが用意されていますので、活用することができます。25. Task Execution and Schedulingを参照してください。

関連する問題