web.xmlとSpringでのイニシャライザ

web.xml vs Initializer with Spring

1. 概要

この記事では、最近のバージョンのSpring Framework:で利用可能なDispatcherServletを構成する3つの異なるアプローチについて説明します。

  1. XML構成とweb.xmlファイルから始めます

  2. 次に、サーブレット宣言をweb.xmlファイルからJava構成に移行しますが、他の構成はXMLに残します

  3. 最後に、リファクタリングの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のブロックを使用して、次のサーブレットを宣言しています。

  1. dispatcher」という名前です

  2. org.springframework.web.servlet.DispatcherServletのインスタンスです

  3. 構成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("/");
    }
}

この例では次のとおりです。

  1. WebApplicationInitializerインターフェースの実装

  2. onStartupメソッドをオーバーライドして、XMLの例でcontextConfigLocationとしてサーブレットに渡されるのと同じファイルで構成された新しいXmlWebApplicationContextを作成します。

  3. 次に、インスタンス化したばかりの新しいコンテキストでDispatcherServletのインスタンスを作成しています

  4. そして最後に、サーブレットをマッピング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と注釈構成には、多くの利点があります。 通常、構成はより短く簡潔になり、アノテーションは構成するコードと同じ場所に配置されるため、宣言により多くのコンテキストを提供します。

しかし、これは常に望ましい方法であるとは限りません。 たとえば、一部の開発者は、コードと構成を分離しておくことを好む場合があります。または、変更できないサードパーティのコードを使用する必要がある場合があります。

6. 結論

この記事では、Spring 3.2+DispatcherServletを構成するさまざまな方法について説明しました。好みに基づいて、どちらを使用するかを決めるのはあなた次第です。 Springは、選択した内容に対応します。

この記事のソースコードは、Githubhereおよびhereにあります。