web-dev-qa-db-ja.com

AbstractAnnotationConfigDispatcherServletInitializerとWebApplicationInitializerを使用する場合

私はSpring 4.0.7で作業しています

JavaConfigを介してSpring MVCを構成することについて調査しました。

昨日まで、これらの2つのオプションを使用した2つの構成を見てきました。

  1. abstractAnnotationConfigDispatcherServletInitializerを拡張します
  2. webMvcConfigurerAdapterを拡張および WebApplicationInitializerを実装

:(2)は、拡張用と実装用の2つのクラスです

(2)を使用しているのは、コンバーター、フォーマッター、リソースハンドラーなどを構成できる多くの例を見つけたためです...

しかし、最近では、StackOverflowに関する質問を支援しようとして、(1)が存在することを認識しました。Googleで(1)について概要を説明し、(1)

私の質問は、この投稿のタイトルがどのように記述されているかです。

ありがとうございました

41
Manuel Jordan

Servlet 3.0仕様のリリースにより、(ほとんど)xmlなしでServlet Containerを設定することが可能になりました。このため、サーブレット仕様には ServletContainerInitializer があります。このクラスでは、従来のweb.xmlで行うように、フィルター、リスナー、サーブレットなどを登録できます。

Springは、 SpringServletContainerInitializer クラスの処理方法を知っている WebApplicationInitializer の実装を提供します。また、Springは、AbstractAnnotationConfigDispatcherServletInitializerもその1つであるため、生活を楽にするために拡張するいくつかの基本クラスを提供します。 ContextLoaderlistener(オプション)とDispatcherServletを登録し、両方のクラスにロードしてフィルターをDispatcherServletに適用し、サーブレットマッピングを提供するための構成クラスを簡単に追加できます。

WebMvcConfigurerAdapterは、Spring MVCを構成するためのDispatcherServletによってロードされたxmlファイルを置き換える、Spring MVCを構成するためのものです。 WebMvcConfigurerAdapterは、@Configurationクラスに使用する必要があります。

@Configuration
@EnableWebMvc
public class WebConfiguration 
    extends WebMvcConfigurerAdapter implements WebApplicationInitializer
{ ... }

これらは基本的に2つの異なる懸念事項であるため、これらを混ぜることはお勧めしません。 1つ目はサーブレットコンテナの構成用、2つ目はSpring MVCの構成用です。

それらを2つのクラスに分割します。

設定用。

@Configuration
@EnableWebMvc
public class WebConfiguration extends WebMvcConfigurerAdapter { ... }

アプリケーションのブートストラップ用。

public class MyWebApplicationInitializer
    extends AbstractAnnotationConfigDispatcherServletInitializer
{

    protected Class<?>[] getRootConfigClasses() {
        return new Class[] {RootConfig.class};
    }

    protected Class<?>[] getServletConfigClasses()  {
        return new Class[] {WebConfiguration .class};
    }

    protected String[] getServletMappings() {
        return new String[] {"/"};
    }

}

追加の利点は、DispatcherServletContextLoaderListenerを手動で構成する代わりに、Springが提供する便利なクラスを使用できるようになったことです。

55
M. Deinum

最初から始めるには、サーブレットコンテナがどのように開始するかを調べる価値があります。

  • SpringServletContainerInitializer は、Servlet 3.0コンテナによって自動的にブートストラップされます。
  • SpringServletContainerInitializerは、WebApplicationInitializerを実装するクラスを探します( spring.io へのリンク。「 Spring In Action "第4版Craig Walls、p.135」にも説明があります)。

そのため、SpringServletContainerInitializerはWebApplicationInitializerを実装する適切なクラスを見つける必要があります。それを実現する方法は2つあります。

  1. 1つは、 WebApplicationInitializer を独自に実装することです。インターフェイスはSpring 3.1で導入されました
  2. 2番目は、WebApplicationInitializerも実装する AbstractAnnotationConfigDispatcherServletInitializer クラスを拡張することです。このクラスは便宜上、Spring 3.2で導入されたものであり、「JavaベースのSpring構成を使用するアプリケーションの推奨アプローチ」です。 -リンクを参照してください。これにより、ルートアプリケーションコンテキストだけでなく、サーブレットアプリケーションコンテキストも開始できます。

また、 WebMvcConfigurerAdapter をWebApplicationInitializerと混同しないでください。名前が示すように、「Mvc」の構成に関係しています。 WebMvcConfigurer からの空のメソッドを実装するアダプタークラスです。 @ EnableWebMvc アノテーションを使用してMvcコントローラーを構成するときに使用します。

お役に立てれば。

12
Witold Kaczurba