public interface WebApplicationInitializer
web.xml
ベースのアプローチとは対照的に(またはおそらくこれと組み合わせて)、ServletContext
EE をプログラムで構成するために Servlet 3.0+ 環境に実装されるインターフェース。 この SPI の実装は SpringServletContainerInitializer
によって自動的に検出されます。SpringServletContainerInitializer
自体は、任意の Servlet 3.0 コンテナーによって自動的にブートストラップされます。このブートストラップメカニズムの詳細については、Javadoc を参照してください。
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
から拡張することもできます。ご覧のとおり、Servlet 3.0 の新しい ServletContext.addServlet(java.lang.String, java.lang.String)
EE メソッドのおかげで、実際に DispatcherServlet
のインスタンスを登録しています。これは、DispatcherServlet
が他のオブジェクトのように処理できることを意味します。この場合、アプリケーションコンテキストのコンストラクターインジェクションを受け取ります。 このスタイルはよりシンプルで簡潔です。init-params などを処理する必要はありません。通常の JavaBean スタイルのプロパティとコンストラクターの引数だけです。DispatcherServlet
に挿入する前に、必要に応じて Spring アプリケーションコンテキストを自由に作成して操作できます。
ほとんどの主要な Spring Web コンポーネントは、このスタイルの登録をサポートするように更新されています。DispatcherServlet
、FrameworkServlet
、ContextLoaderListener
、DelegatingFilterProxy
はすべてコンストラクター引数をサポートするようになりました。コンポーネント(Spring 以外、その他のサードパーティなど)が WebApplicationInitializers
内で使用するために特別に更新されていない場合でも、どのような場合でも使用できます。Servlet 3.0 ServletContext
API を使用すると、init-params、context-params などをプログラムで設定できます。
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
に集中される可能性が高いため、この機能の使用はまれであると予想されます。WEB-INF/web.xml
と WebApplicationInitializer
の使用は相互に排他的ではありません。たとえば、web.xml は 1 つのサーブレットを登録でき、WebApplicationInitializer
は別のサーブレットを登録できます。イニシャライザーは、ServletContext.getServletRegistration(String)
EE などのメソッドを介して web.xml
で実行される登録を変更することもできます。ただし、WEB-INF/web.xml
がアプリケーションに存在する場合、その version
属性を "3.0" 以上に設定する必要があります。そうでない場合、ServletContainerInitializer
ブートストラップはサーブレットコンテナーによって無視されます。。
Apache Tomcat は内部の DefaultServlet
を "/" にマッピングしますが、Tomcat バージョン <= 7.0.14 では、このサーブレットマッピングをプログラムで上書きすることはできません。7.0.15 はこの課題を修正します。"/" サーブレットマッピングの上書きも GlassFish 3.1 で正常にテストされています。
修飾子と型 | メソッドと説明 |
---|---|
void | onStartup(ServletContextEE servletContext) この Web アプリケーションの初期化に必要なサーブレット、フィルター、リスナー context-params および属性を使用して、指定された ServletContext EE を構成します。 |
void onStartup(ServletContextEE servletContext) throws ServletExceptionEE
ServletContext
EE を構成します。上記の例を参照してください。servletContext
- 初期化する ServletContext
ServletExceptionEE
- 指定された ServletContext
に対する呼び出しが ServletException
をスローした場合