サーブレット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の実装クラスを取得することです。