web.xml vs Initializer with Spring
1. 概要
この記事では、最近のバージョンのSpring Framework:で利用可能なDispatcherServletを構成する3つの異なるアプローチについて説明します。
-
XML構成とweb.xmlファイルから始めます
-
次に、サーブレット宣言をweb.xmlファイルからJava構成に移行しますが、他の構成はXMLに残します
-
最後に、リファクタリングの3番目の最後のステップで、100%Javaで構成されたプロジェクトを作成します。
2. DispatcherServlet
Spring MVCのコアコンセプトの1つは、DispatcherServletです。 Spring documentationはそれを次のように定義します。
HTTPリクエストハンドラー/コントローラーの中央ディスパッチャ。 Web UIコントローラーまたはHTTPベースのリモートサービスエクスポーター用。 Webリクエストを処理するために登録されたハンドラーにディスパッチし、便利なマッピングおよび例外処理機能を提供します。
基本的に、DispatcherServletはすべてのSpring MVCアプリケーションのエントリポイントです。 その目的は、HTTPリクエストをインターセプトし、それらを処理する方法を知っている適切なコンポーネントにディスパッチすることです。
3. web.xmlを使用した構成
従来のSpringプロジェクトを扱う場合、XML構成を見つけることは非常に一般的であり、Spring 3.1までは、DispatcherServletを構成する唯一の方法はWEB-INF/web.xmlを使用することでした。ファイル。 この場合、2つの手順が必要です。
構成例を見てみましょう。最初のステップはサーブレット宣言です。
dispatcher
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
/WEB-INF/spring/dispatcher-config.xml
1
このXMLのブロックを使用して、次のサーブレットを宣言しています。
-
「dispatcher」という名前です
-
org.springframework.web.servlet.DispatcherServletのインスタンスです
-
構成XMLへのパスを含むcontextConfigLocationという名前のパラメーターで初期化されます
load-on-startupは、複数のサーブレットがロードされる順序を指定する整数値です。 したがって、複数のサーブレットを宣言する必要がある場合は、初期化する順序を定義できます。 小さい整数でマークされたサーブレットは、大きい整数でマークされたサーブレットの前にロードされます。
これで、サーブレットが構成されました。 2番目のステップは、servlet-mappingを宣言することです。
dispatcher
/
サーブレットマッピングを使用して、名前でURLpatternにバインドします。これは、HTTPリクエストが処理されることを指定します。
4. ハイブリッド構成
Servlet APIsのバージョン3.0の採用により、web.xmlファイルはオプションになり、Javaを使用してDispatcherServletを構成できるようになりました。
WebApplicationInitializerを実装するサーブレットを登録できます。 これは、上記のXML構成と同等です。
public class MyWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
XmlWebApplicationContext context = new XmlWebApplicationContext();
context.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
ServletRegistration.Dynamic dispatcher = container
.addServlet("dispatcher", new DispatcherServlet(context));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
この例では次のとおりです。
-
WebApplicationInitializerインターフェースの実装
-
onStartupメソッドをオーバーライドして、XMLの例でcontextConfigLocationとしてサーブレットに渡されるのと同じファイルで構成された新しいXmlWebApplicationContextを作成します。
-
次に、インスタンス化したばかりの新しいコンテキストでDispatcherServletのインスタンスを作成しています
-
そして最後に、サーブレットをマッピングURLpatternで登録します。
そのため、Javaを使用してサーブレットを宣言し、それをURL mappingにバインドしましたが、構成は別のXMLファイルdispatcher-config.xmlに保持しました。
5. 100 %(t0)s構成
このアプローチでは、サーブレットはJava,で宣言されますが、それを構成するにはXMLファイルが必要です。 WebApplicationInitializerを使用すると、100 %(t3)s構成を実現できます。
前の例をリファクタリングする方法を見てみましょう。
最初に行う必要があるのは、サーブレットのアプリケーションコンテキストを作成することです。
今回は、注釈ベースのコンテキストを使用して、構成にJavaと注釈を使用し、dispatcher-config.xmlのようなXMLファイルの必要性を排除できるようにします。
AnnotationConfigWebApplicationContext context
= new AnnotationConfigWebApplicationContext();
このタイプのコンテキストは、構成クラスを登録して構成できます。
context.register(AppConfig.class);
または、構成クラスをスキャンするパッケージ全体を設定します。
context.setConfigLocation("com.example.app.config");
アプリケーションコンテキストが作成されたので、コンテキストをロードするリスナーをServletContextに追加できます。
container.addListener(new ContextLoaderListener(context));
次のステップは、ディスパッチャサーブレットの作成と登録です。
ServletRegistration.Dynamic dispatcher = container
.addServlet("dispatcher", new DispatcherServlet(context));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
これで、WebApplicationInitializerは次のようになります。
public class MyWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
AnnotationConfigWebApplicationContext context
= new AnnotationConfigWebApplicationContext();
context.setConfigLocation("com.example.app.config");
container.addListener(new ContextLoaderListener(context));
ServletRegistration.Dynamic dispatcher = container
.addServlet("dispatcher", new DispatcherServlet(context));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
Javaと注釈構成には、多くの利点があります。 通常、構成はより短く簡潔になり、アノテーションは構成するコードと同じ場所に配置されるため、宣言により多くのコンテキストを提供します。
しかし、これは常に望ましい方法であるとは限りません。 たとえば、一部の開発者は、コードと構成を分離しておくことを好む場合があります。または、変更できないサードパーティのコードを使用する必要がある場合があります。