パッケージ org.springframework.web

インターフェース WebApplicationInitializer

すべての既知の実装クラス:
AbstractAnnotationConfigDispatcherServletInitializerAbstractContextLoaderInitializerAbstractDispatcherServletInitializerAbstractReactiveWebInitializer

public interface WebApplicationInitializer
従来の web.xml ベースのアプローチとは対照的に (または場合によってはそれと組み合わせて)、ServletContextEE をプログラムで構成するためにサーブレット環境に実装されるインターフェースです。

この SPI の実装は、SpringServletContainerInitializer によって自動的に検出され、それ自体が任意のサーブレットコンテナーによって自動的にブートストラップされます。このブートストラップメカニズムの詳細については、Javadoc を参照してください。

サンプル

従来の XML ベースのアプローチ

Web アプリケーションを構築するほとんどの Spring ユーザーは、Spring の  DispatcherServlet を登録する必要があります。参考までに、WEB-INF/web.xml では、これは通常次のように行われます。
 <servlet>
   <servlet-name>dispatcher</servlet-name>
   <servlet-class>
     org.springframework.web.servlet.DispatcherServlet
   </servlet-class>
   <init-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>/WEB-INF/spring/dispatcher-config.xml</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
 </servlet>

 <servlet-mapping>
   <servlet-name>dispatcher</servlet-name>
   <url-pattern>/</url-pattern>
 </servlet-mapping>

WebApplicationInitializer によるコードベースのアプローチ

同等の DispatcherServlet 登録ロジックである WebApplicationInitializer スタイルは次のとおりです。
 public class MyWebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext container) {
      XmlWebApplicationContext appContext = new XmlWebApplicationContext();
      appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");

      ServletRegistration.Dynamic dispatcher =
        container.addServlet("dispatcher", new DispatcherServlet(appContext));
      dispatcher.setLoadOnStartup(1);
      dispatcher.addMapping("/");
    }

 }
上記の代わりに、AbstractDispatcherServletInitializer から拡張することもできます。ご覧のとおり、サーブレットコンテナーの ServletContext.addServlet(java.lang.String, java.lang.String)EE メソッドのおかげで、実際に DispatcherServletインスタンスを登録しています。これは、DispatcherServlet を他のオブジェクトと同じように扱うことができることを意味します。この場合、アプリケーションコンテキストのコンストラクターインジェクションを受け取ります。

このスタイルはよりシンプルで簡潔です。init-params などを処理する必要はありません。通常の JavaBean スタイルのプロパティとコンストラクターの引数だけです。DispatcherServlet に挿入する前に、必要に応じて Spring アプリケーションコンテキストを自由に作成して操作できます。

主要な Spring Web コンポーネントのほとんどは、このスタイルの登録をサポートするように更新されています。DispatcherServletFrameworkServletContextLoaderListenerDelegatingFilterProxy がすべてコンストラクター引数をサポートするようになったことがわかります。コンポーネント (Spring 以外、他のサードパーティなど) が WebApplicationInitializers 内で使用するために特別に更新されていない場合でも、いずれの場合でも使用できます。ServletContext API を使用すると、init-params、context-params などをプログラムで設定できます。

100% コードベースの構成アプローチ

上の例では、WEB-INF/web.xml を WebApplicationInitializer の形でコードに置き換えることに成功しましたが、実際の dispatcher-config.xml Spring の設定は XML ベースのままでした。WebApplicationInitializer は、Spring のコードベースの @Configuration クラスとの使用に最適です。完全な詳細については @Configuration Javadoc を参照してくださいが、次の例は XmlWebApplicationContext の代わりに Spring の AnnotationConfigWebApplicationContext を使用するためのリファクタリングと、Spring の XML ファイルの代わりにユーザ定義の @Configuration クラス AppConfig と DispatcherConfig を使用するためのリファクタリングを示しています。この例では、上記の例を少し超えて、' ルート ' アプリケーションコンテキストの典型的な設定と ContextLoaderListener の登録を示しています。
 public class MyWebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext container) {
      // Create the 'root' Spring application context
      AnnotationConfigWebApplicationContext rootContext =
        new AnnotationConfigWebApplicationContext();
      rootContext.register(AppConfig.class);

      // Manage the lifecycle of the root application context
      container.addListener(new ContextLoaderListener(rootContext));

      // Create the dispatcher servlet's Spring application context
      AnnotationConfigWebApplicationContext dispatcherContext =
        new AnnotationConfigWebApplicationContext();
      dispatcherContext.register(DispatcherConfig.class);

      // Register and map the dispatcher servlet
      ServletRegistration.Dynamic dispatcher =
        container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext));
      dispatcher.setLoadOnStartup(1);
      dispatcher.addMapping("/");
    }

 }
上記の代わりに、AbstractAnnotationConfigDispatcherServletInitializer から拡張することもできます。WebApplicationInitializer 実装は自動的に検出されることに注意してください。必要に応じて、アプリケーション内で自由にパッケージ化できます。

WebApplicationInitializer 実行のオーダー

WebApplicationInitializer 実装は、オプションで、Spring の @Order アノテーションを使用してクラスレベルでアノテーションを付けたり、Spring の Ordered インターフェースを実装したりできます。その場合、初期化子は呼び出しの前に順序付けられます。これにより、ユーザーは、サーブレットコンテナーの初期化が行われる順序を確認できます。一般的なアプリケーションでは、すべてのコンテナーの初期化が単一の WebApplicationInitializer に集中される可能性が高いため、この機能の使用はまれであると予想されます。
導入:
3.1
作成者:
Chris Beams
関連事項:
  • メソッドのサマリー

    修飾子と型
    メソッド
    説明
    void
    onStartup(ServletContextEE servletContext)
    この Web アプリケーションの初期化に必要なサーブレット、フィルター、リスナー context-params および属性を使用して、指定された ServletContextEE を構成します。
  • メソッドの詳細

    • onStartup

      void onStartup(ServletContextEE servletContext) throws ServletExceptionEE
      この Web アプリケーションの初期化に必要なサーブレット、フィルター、リスナー context-params および属性を使用して、指定された ServletContextEE を構成します。上記の例を参照してください。
      パラメーター:
      servletContext - 初期化する ServletContext 
      例外:
      ServletExceptionEE - 指定された ServletContext に対する呼び出しが ServletException をスローした場合