サーブレットのspringMVC WebApplicationInitializer置換原則のweb.xml構成

サーブレット3.0の前に、XML設定 

春+ springMCVを構築するために過去には、最初のステップであるものをすべての最初のTomcatにロードされたサーブレットspringMVC、web.xmlファイルを設定することです。ディスパッチャをロードすることによって、全体の春のコンテナを起動します。web.xmlが次のように。

  < サーブレット> 
    < サーブレット名>ディスパッチャ</ サーブレット名> 
    < サーブレットクラス>
      org.springframework.web.servlet.DispatcherServlet
    </ サーブレットクラス> 
    < INIT-PARAM > 
      < PARAM名> contextConfigLocation </ PARAM名> 
      < PARAM値> /WEB-INF/spring/dispatcher-config.xml </ PARAM値> 
    </ INIT- PARAM > 
    < のload-on-startup > 1 </ のload-on-startup > 
  </ サーブレット>
 
  < のservlet-mapping > 
    < サーブレット名>ディスパッチャ</ サーブレット名> 
    < のurl-pattern > / </ のurl-pattern > 
  </ のservlet-mapping >

 サーブレット3.0、Java構成した後、

サーブレット3.0+時代に入った後、サーブレット・サポート・注釈は、構成サーブレットを変更しましたが、春には、構成Javaコードをお勧めします。次に、上記サーブレットweb.xml構成は、以下の、直接コードを見て、達成WebApplicationInitializerインターフェイス構成サーブレットによって達成することができます

インポートのjavax.servlet.ServletContext;
輸入javax.servlet.ServletException;
輸入javax.servlet.ServletRegistration.Dynamic;

輸入org.springframework.web.WebApplicationInitializer。
輸入org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
輸入org.springframework.web.servlet.DispatcherServlet;

パブリック クラス WebInitializerが実装 WebApplicationInitializer { // 1实现接口
    @Override
     公共 ボイド onStartup(のServletContextのServletContext)がスローServletExceptionがを{
        AnnotationConfigWebApplicationContext CTX = 新しいAnnotationConfigWebApplicationContext();
        ctx.register(MyMvcConfig。クラス); // 自分のプロファイルに登録 
        ctx.setServletContext(のServletContextを); // 2プット・スプリングは、コンテナの中に注入されたServletContext 
        サーブレット( "ディスパッチャ"、ダイナミック= servletContext.addServletを新しい新しいのDispatcherServlet(CTX)) ; // 3負荷ディスパッチャサーブレット。
        servlet.addMapping( "/" );
        servlet.setLoadOnStartup( 1 )。
    }
}

 

そのJavaの設定ファイルのMyMvcConfig。ここで行うには、単にコンテナパーサを注入しようとしています。
輸入org.springframework.context.annotation.Bean。
輸入org.springframework.context.annotation.ComponentScan;
輸入org.springframework.context.annotation.Configuration。
輸入org.springframework.web.servlet.config.annotation.EnableWebMvc;
輸入org.springframework.web.servlet.view.InternalResourceViewResolver;
輸入org.springframework.web.servlet.view.JstlView。

@Configuration // サポートプロファイル 
@EnableWebMvc // オープンspringMCV 
@ComponentScan( "XXX")// スキャンファイルは、Javaロードする
パブリック クラス{MyMvcConfigを
    @豆
    公共InternalResourceViewResolver viewResolver(){
        InternalResourceViewResolver viewResolver = 新しいInternalResourceViewResolver();
        viewResolver.setPrefix( "/ WEB-INF /クラス/ビュー/" );
        viewResolver.setSuffix( ".jspという" );
        viewResolver.setViewClass(JstlView。クラス);
        返すviewResolverを。
    }
}

 

[OK]実際には、この構成は、Tomcatにデプロイする、実行し、春にはさまざまなコンポーネントを起動するWebInitializer.onStartupを開始します。

原理分析

ときに最初に暴露し、まだ混乱?これは、Tomcatの時間、どのように、まだこの方法をWebInitializer.onStartup実行する方法です。トラッキングコードは、2つのスプリングジャーパッケージは、参照コード、桟橋のサポート、ウェブジャーパッケージを有している
トラッキングコードは、桟橋を研究しない、唯一のウェブここで、以下に示すように

このクラスにSpringServletContainerInitializer点は、このクラスが継承見出さServletContainerInitializerこのインタフェース、パス実装:のjavaxをサーブレット .ServletContainerInitializer。このクラスは、春のことではありません。完全なコード:

パッケージorg.springframework.web。

輸入java.lang.reflect.Modifier。
輸入java.util.LinkedList;
輸入はjava.util.List;
輸入java.util.ServiceLoader。
輸入java.util.Set;
輸入javax.servlet.ServletContainerInitializer。
インポートのjavax.servlet.ServletContext;
輸入javax.servlet.ServletException;
輸入javax.servlet.annotation.HandlesTypes。

輸入org.springframework.core.annotation.AnnotationAwareOrderComparator。

/ 
@HandlesTypes(WebApplicationInitializer。クラスパブリック クラス SpringServletContainerInitializerが実装ServletContainerInitializerを{
    @オーバーライド
    公共 のボイド onStartup(セット<クラス<?>> webAppInitializerClasses、のServletContextのServletContext)が
             スローServletExceptionがが{

        一覧 <WebApplicationInitializer>初期化子= 新しい LinkedListは<WebApplicationInitializer> ();

        もし(!webAppInitializerClasses = ヌル){
             のために(クラス<?> waiClass:webAppInitializerClasses){
                 // 守勢う:一部のサーブレットコンテナが、無効なクラスを提供してくれる
                 // ... @HandlesTypesが言う何で
                あれば!(waiClass.isInterface ()&&!Modifier.isAbstract(waiClass.getModifiers())&& 
                        WebApplicationInitializer。クラス.isAssignableFrom(waiClass)){
                     試み{
                        initializers.add((WebApplicationInitializer)waiClass.newInstance())。
                    }
                    キャッチ(ThrowableのEX){
                         スロー 新しい( "WebApplicationInitializerクラスをインスタンス化に失敗しました" ServletExceptionが、EX)を、
                    }
                }
            }
        }

        もし(initializers.isEmpty()){
            servletContext.log(「いいえ春WebApplicationInitializerタイプはクラスパス上で検出されました」);
            返します
        }

        AnnotationAwareOrderComparator.sort(初期化子)。
        servletContext.log( "クラスパス上で検出されたスプリングWebApplicationInitializers:" + 初期化子);

        {(初期化子WebApplicationInitializer初期化子)
            initializer.onStartup(のServletContext)。
        }
    }

}

 

 
黄色でマークされます、オリジナルではない外観は、すべて WebApplicationInitializerは再び、それに合格しonStartup ServletContextへのメソッドを呼び出して横断しました。そして、我々はWebInitializerが属する書き始め
WebApplicationInitializerので、私たちはここから実行WebInitializer。だから、ServletContainerInitializerはどのようにロードされていますか?これはTomcatでのコードの反対側に依存し、私は推測する、方法をonStartup実行し、すべてのServletContainerInitializerの実装クラスを取得することです。



 

おすすめ

転載: www.cnblogs.com/jonrain0625/p/11291969.html