2012-01-25 13 views
0

私はSpringベースのWebアプリケーションを持っていますが、バックグラウンドプロセスもあります。バックグラウンドプロセスの内側から、私は春の豆にアクセスできるようにしたいと思います。私は通常使用して春の豆を取り出す:サーブレット/ WebアプリケーションコンテキストなしのSpring Beanへのアクセス

ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(getServletContext()); 
Object mySpringBean = context.getBean("mySpringBean"); 

問題は、私のバックグラウンド・プロセスがベースのサーブレットされていないとServletContextへのアクセスを持っていないということです。バックグラウンドプロセスは、独自のタスク実行プログラムによって起動されます。このタスク実行プログラムはClass.forNameを使用してバックグラウンドプロセスをインスタンス化し、タスク実行プログラムを変更することはできません。

バックグラウンドプロセスで春の豆にアクセスすることは可能ですか?もしそうなら、どうですか?

答えて

1

`

ApplicationContext context = new ClassPathXmlApplicationContext("/spring-activemq/spring-activemq-producer-nio.xml"); 

あなたがしなければならないのは、あなたのXMLが

+0

これにより、XMLファイル内のすべてのBeanの追加インスタンスがSpringにインスタンス化されますか?または、webappによって作成されたSpringコンテキストにアクセスしますか?あるいは、バックグラウンドプロセスで必要とされるBeanだけを列挙した別のXMLファイルを作成することもできます。それは良いでしょうか? – David

+2

ダビデ、後者はより良いでしょう。これは時間の経過と共に豆が変わるので、別個のコンテキストファイルのメンテナンスが増えることを意味しますが、価値があります。 – schtever

+0

これは、Webアプリケーションによって作成されたリンクとのリンクなしで、新しいSpringコンテキストを作成します。 –

0

あなたのバックグラウンドプロセスは手動でコンテキストを作成する必要があります。通常、これはプロセスの初期化中に1回実行されます。

何か等:

のApplicationContextコンテキスト=新しいClassPathXmlApplicationContext(新しいString [] { "appContext.xml"}、TRUE)。

このことについてどのように
3

Springコンテキストをロードするためのorg.springframework.context.support.ClassPathXmlApplicationContextを使用してみてくださいここで指定します:?

ApplicationContext context = new ClassPathXmlApplicationContext("/path/to/applicationContext.xml"); 
+1

しかし、それらはサーブレットが使用しているものと同じではありません。バックグラウンドプロセスは独自のスプリングコンテキストを持ち、これらのBeanを再作成します。 –

4

まず、私の解決策は理想的ではありません。これを使用する前に、アプリケーションのアーキテクチャーについて考えてください。コンテキストにアクセスするために構造的な変更を加えることは可能かもしれません。

あなたが維持している複数のコンテキストがある場合は、明らかにそれらを並べ替えるためにもう少し論理を追加する必要があります。

あなたはApplicationContextAware Beanを作成し、静的経由して、あなたのコンテキストにアクセスすることができます:あなたは、バックグラウンド・プロセスのコンテキストを登録する方法を持っている場合、

@Component 
public class SpringApplicationContext implements ApplicationContextAware { 

    private static ApplicationContext CONTEXT; 

    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 
     CONTEXT = applicationContext; 
    } 

    public static <T> T getBean(Class<? extends T> beanClass) { 
     return CONTEXT.getBean(beanClass); 
    } 

    protected static ApplicationContext getContext() { 
     return SpringApplicationContext.CONTEXT; 
    } 
} 

別のオプションは、あなたがそれを行うことができ、ありますsetApplicationContextメソッド。

+0

このアプローチは私の場合に最適です。ありがとう! – Badal

関連する問題