2017-06-22 6 views
7

まで待って、私は構築(または建物を進める)するApplicationListener<ContextRefreshedEvent>イベント火災メッセージに例えばコンテキストロードを、終えた後、DBbuildServletDispatcherをロードしたいと考えてくださいAppServletDispatcherコンテキスト春:ServeltDispatcherコンテキストは別のコンテキスト仕上げロード

SpringMultiDisp

AppDispatcher ContextDBbuild Contextの作成が完了するまで待つことができますか?これを行う一般的な方法はありますか?

+0

load-on-startupよりも低いことを確認します。それが正しいのかどうかはわかりませんが、アプリのコンテキストがDBを待つことは間違いありません。 –

+0

web.xmlのAppDispatcher Contextに対して、 1をDBbuild Contextに、 2を追加する必要があります。これを達成する。 –

答えて

6

簡単です。 paramスコープには、コンテキスト・パラームとサーブレットのinit paramという2つのタイプがあります。必要なのは、すべての依存関係を子コンテキストがロードされる前に初期化する必要があることです。ここでDBbuildServletDispatcherが親コンテキストで初期化する必要があり、それは、ApplicationContextのあり、そしてAppServletDispatcherは、コンテキストのparamとの最初の部分は、コンテキストファイルをロードし、作成

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     /WEB-INF/spring/DBbuildServletDispatcher.xml 
    </param-value> 
</context-param> 



<servlet> 
    <servlet-name>firstServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/AppServletDispatcher.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>my-servlet</servlet-name> 
    <url-pattern>/abc/* </url-pattern> 
</servlet-mapping> 

アプリケーションコンテキストの子コンテキストであるWebApplicationContextですApplicationContext 2番目の部分はWebApplicationContextを定義します。 hereおよびWebApplicationContextUtilsも参照されたい。

2

このようなものが動作する可能性があります。今appServletContext.xmlだけコンテキストを作成します

package a.b.c; 

import org.springframework.context.ApplicationContext; 
import org.springframework.context.ApplicationEvent; 
import org.springframework.context.ApplicationListener; 
import org.springframework.context.event.ContextRefreshedEvent; 

public class ApplicationListenerBean implements ApplicationListener { 

    @Override 
    public void onApplicationEvent(ApplicationEvent event) { 
     if (event instanceof ContextRefreshedEvent) { 
      ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("appServletContext.xml"); 

     } 
    } 
} 

をクラスを定義し、次に

<bean id="eventListenerBean" class="a.b.c.ApplicationListenerBean" /> 

:あなたは、この行を追加した後

のみDBbuildContext.xml(applicationContext.xmlを)をロードdbBuildContext.xmlがロードされたとき。

1

ただ、任意の通常のWebServletのように、ディスパッチャサーブレットのインスタンス化がのload-on-startup要素は、このサーブレットがすべきことを示しているservlet 2.5 web.xml xsd

を見てみると<load-on-startup>

を使用して、web.xmlで注文することができます のWebアプリケーションの起動時に が読み込まれ(インスタンス化され、init()が呼び出されます)。これらの要素のオプションの内容は、サーブレットのロード順序を示す整数 でなければなりません。 の値が負の整数である場合、または要素が存在しない場合、 コンテナは、選択するたびにサーブレットを自由にロードできます。 の値が正の整数または0の場合、アプリケーションのデプロイ時にコンテナがロードされ、サーブレットが初期化されなければなりません。コンテナ は、より小さな整数でマークされたサーブレットがより高い整数でマークされる前に がロードされることを保証する必要があります。コンテナは、同じ起動時負荷値を持つサーブレットのロード順序を として選択できます。

のでDBbuildServletDispatcherが最初にロードされるためにINORDER、そのload-on-startupあなたはDBのコンテキストの子としてアプリケーションコンテキストをマークすることができAppServletDispatcher

<servlet> 
    <servlet-name>DBbuildServletDispatcher</servlet-name> 
    <servlet-class>com.foo.DBbuildServletDispatcher</servlet-class> 
    <load-on-startup>0</load-on-startup> 
</servlet> 
<servlet> 
    <servlet-name>AppServletDispatcher</servlet-name> 
    <servlet-class>com.foo.AppServletDispatcher</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
関連する問題