public class SpringServletContainerInitializer extends java.lang.Object implements ServletContainerInitializerEE
ServletContainerInitializer
EE は、Spring の WebApplicationInitializer
SPI を使用して、従来の web.xml
ベースのアプローチとは対照的に(またはおそらく組み合わせて)、サーブレットコンテナーのコードベースの構成をサポートするように設計されています。spring-web
モジュール JAR がクラスパス上にあると想定して、コンテナーの起動時に Servlet 3.0 準拠のコンテナーによって呼び出される onStartup(java.util.Set<java.lang.Class<?>>, javax.servlet.ServletContext)
メソッドを持ちます。これは、ZAR サービス API の ServiceLoader.load(Class)
メソッドが spring-web
モジュールの META-INF/services/javax.servlet.ServletContainerInitializer
サービスプロバイダー構成ファイルを検出することで発生します。詳細については、JAR サービス API ドキュメントSEおよび Servlet 3.0 Final Draft 仕様のセクション 8.2.4 を参照してください。web.xml
と組み合わせて web.xml
の metadata-complete
属性または web.xml
の <absolute-ordering>
要素を介して、起動時にサーブレットコンテナーが行うクラスパススキャンの量を制限することを選択できます。ServletContainerInitializer
スキャンを実行できます。この機能を使用する場合、web.xml
の名前付き Web フラグメントのリストに次のように "spring_web" を追加することにより、SpringServletContainerInitializer
を有効にできます。
<absolute-ordering>
<name>some_web_fragment</name>
<name>spring_web</name>
</absolute-ordering>
WebApplicationInitializer
との関連 WebApplicationInitializer
SPI は、WebApplicationInitializer.onStartup(ServletContext)
という 1 つのメソッドのみで構成されています。署名は意図的に ServletContainerInitializer.onStartup(Set, ServletContext)
EE と非常によく似ています。簡単に言えば、SpringServletContainerInitializer
は ServletContext
をインスタンス化し、ユーザー定義の WebApplicationInitializer
実装に委譲するロールを果たします。ServletContext
を初期化する実際の作業を行うのは、各 WebApplicationInitializer
の責任です。委譲の正確なプロセスは、以下の onStartup
のドキュメントで詳細に説明されています。WebApplicationInitializer
SPI のサポートインフラストラクチャと見なす必要があります。このコンテナー初期化子を利用することも完全にオプションです。この初期化子がすべての Servlet 3.0+ ランタイムでロードされて呼び出されることは事実ですが、クラスパスで WebApplicationInitializer
実装を使用可能にするかどうかはユーザーの選択のままです。WebApplicationInitializer
型が検出されない場合、このコンテナー初期化子は効果がありません。 このコンテナー初期化子と WebApplicationInitializer
の使用は、型が spring-web
モジュール JAR に含まれているという事実を除いて、Spring MVC に「結び付けられていない」ことに注意してください。むしろ、それらは ServletContext
の便利なコードベースの構成を容易にする機能において汎用と見なすことができます。つまり、Spring MVC 固有のコンポーネントだけでなく、任意のサーブレット、リスナー、フィルターを WebApplicationInitializer
内に登録できます。
このクラスは拡張用に設計されておらず、拡張されることも意図していません。これは、WebApplicationInitializer
が公開の SPI である内部型と見なされる必要があります。
WebApplicationInitializer
Javadoc を参照してください。onStartup(Set, ServletContext)
, WebApplicationInitializer
コンストラクターと説明 |
---|
SpringServletContainerInitializer() |
修飾子と型 | メソッドと説明 |
---|---|
void | onStartup(java.util.Set<java.lang.Class<?>> webAppInitializerClasses, ServletContextEE servletContext) ServletContext を、アプリケーションクラスパスに存在する WebApplicationInitializer 実装に委譲します。 |
public void onStartup(java.util.Set<java.lang.Class<?>> webAppInitializerClasses, ServletContextEE servletContext) throws ServletExceptionEE
ServletContext
を、アプリケーションクラスパスに存在する WebApplicationInitializer
実装に委譲します。 このクラスは @HandlesTypes(WebApplicationInitializer.class)
を宣言するため、Servlet 3.0+ コンテナーは自動的にクラスパスをスキャンして Spring の WebApplicationInitializer
インターフェースの実装を探し、そのようなすべての型のセットをこのメソッドの webAppInitializerClasses
パラメーターに提供します。
WebApplicationInitializer
実装がクラスパスに見つからない場合、このメソッドは事実上ノーオペレーションです。ServletContainerInitializer
が実際に呼び出されましたが、WebApplicationInitializer
実装が見つからなかったことをユーザーに通知する INFO レベルのログメッセージが発行されます。
1 つ以上の WebApplicationInitializer
型が検出されたと仮定すると、それらはインスタンス化されます(@@Order
アノテーションが存在する場合、または Ordered
インターフェースが実装されている場合はソートされます)。次に、各インスタンスで WebApplicationInitializer.onStartup(ServletContext)
メソッドが呼び出され、各インスタンスが Spring の DispatcherServlet
などのサーブレット、Spring の ContextLoaderListener
などのリスナー、フィルターなどの他のサーブレット API コンポーネントを登録および構成できるように ServletContext
を委譲します。
ServletContainerInitializerEE
の onStartupEE
webAppInitializerClasses
- アプリケーションクラスパスにある WebApplicationInitializer
のすべての実装 servletContext
- 初期化されるサーブレットコンテキスト ServletExceptionEE
WebApplicationInitializer.onStartup(ServletContext)
, AnnotationAwareOrderComparator