DispatcherServiceletとスプリングコンテナ作成プロセス
これに先立ち,DispatcherServiceletとは何か,Spring Binとその管理を担当するSpringコンテナについて理解した.
このセクションでは、DispatcherServiceletとスプリングコンテナの作成方法について説明します.
「サーブレットContext」は、複数のWebアプリケーションを1つの「猫」から別の「猫」に移動させるためのコンテキストであり、1つの「板」と「板」コンテナ間で対話するために使用されます.
各Webアプリケーションにはサーブレットコンテキストがあります.サーバハブを作成すると、コンテキストが作成され、終了時に消えます.[前の投稿Tomcatセクションを参照]
DispatcherServiceletは、サーバコンテナがコンテキストを初期化するときに作成されることを示します.Tomcat内の各Webアプリケーションでは、単一の存在するサーブレットコンテキストを初期化する方法がいくつかあります.
Webapp/WEB-INFディレクトリに
Dispatcherサーブレットはサーブレットです.サーバが
テンプレートに
バージョン3.0から、
これもスプリングを使って起動した時に
Springは、spring Webアプリケーションを最初に起動したときに
スプリングフレームプロジェクトを最初に作成する方法は、
2つのWebApplicationContextを使用して実装できます. すなわち、DispatcherServicelet+スプリングコンテナを生成する方法は複数ある.
1.
2.
3.
4.
現在の主流はニンジンWebApplicationInitializer実装+Javaプロファイル方式です.スプリングスタートもこの形のようです.
2番と3番について、実現方法を知りたいのですが、残りの応用はこれではあまり差がありません.
サーブレットContainerInitializerによって実装されるSpring Frameworkでは、サーバコンテキストを初期化し、DispacherServiceとApplicationContextの作成場所を表示します.
その後、パラメータとして
基本的に、スプリングには
普通はそんなことは起こらないけど、web.xmlを変更すると、DispatcherServiceletは複数存在します.
前述したように、DispatcherServiceletは初期化時にアプリケーションコンテキスト(スプリングコンテナ)を作成します.ここで使用するアプリケーションコンテキストはDispatcherServiceletでのみ使用できます.
複数のDispatcherServicelet共有が必要なApplicationContextがある場合があります.このとき使用されるのは
注意事項は上記の
web.xmlのみならず、WebApplicationInitializerインプリメンテーションでContextLoaderListenerを使用することもできます.
空探索では領域コンテナを優先的に確認し,なければグローバルコンテナへ探索する.そのため、埋め方があればエリアコンテナを優先します.
このセクションでは、DispatcherServiceletとスプリングコンテナの作成方法について説明します.
DispatcherServiceletの作成ポイント
DispatcherServlet
はTomcatによって実行されるサーブレットであり、Tabletコンテナ(Tomcat)がweb.xml
配置技術者ファイルによってWebアプリケーションのサーブレットコンテキストを初期化する際に、オプションに従ってlazy loading
またはpre loading
で生成される.テンプレートコンテキスト
「サーブレットContext」は、複数のWebアプリケーションを1つの「猫」から別の「猫」に移動させるためのコンテキストであり、1つの「板」と「板」コンテナ間で対話するために使用されます.
各Webアプリケーションにはサーブレットコンテキストがあります.サーバハブを作成すると、コンテキストが作成され、終了時に消えます.[前の投稿Tomcatセクションを参照]
DispatcherServiceletの作成方法
DispatcherServiceletは、サーバコンテナがコンテキストを初期化するときに作成されることを示します.Tomcat内の各Webアプリケーションでは、単一の存在するサーブレットコンテキストを初期化する方法がいくつかあります.
1. web.xml導入技術者の設定
Webapp/WEB-INFディレクトリに
web.xml
を設定することにより、サーバコンテキストを初期化し、DispatcherServiceを生成する方法.web.xml
...
...
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
...
...
Lazy Loadingの作成
Dispatcherサーブレットはサーブレットです.サーバが
lazy loading 방식
の場合、Tomcatの実行時にサーバインスタンスは作成されないため、最初は서블릿 컨테이너
にDispatcherServiceletインスタンスはありません.最初にクライアントからリクエストを受信すると、サーバコンテナはDispatcherServiceletのオブジェクトを作成し、次のリクエストからモノトーンを使用します.Pre Loadingの作成
テンプレートに
load-on-startup
オプションがある場合は、pre loading
でテンプレートインスタンスを作成し、テンプレートコンテキストを初期化するときにDispatcherServiceletインスタンスを事前に作成することを示します.servlet-context.xml
は、DispatcherServiceletの内部でのみ使用されるアプリケーションコンテキストを作成するためのプロファイルであり、次はスプリングコンテナ作成部である.2.WebApplicationInitializerの実装
バージョン3.0から、
web.xml
を必要とせずにサーバコンテキストの初期化を行うことができます.ServletContainerInitializer API
が用意されているため、フレームレベルで直接初期化することができます.これもスプリングを使って起動した時に
web.xml
がなかった理由です…!Springは、spring Webアプリケーションを最初に起動したときに
ServletContainerInitializer
インタフェースを実装するクラスを検索し、初期化タスクを委任するWebApplicationInitializer
を実装したクラスをWebモジュールに含む.スプリングフレームプロジェクトを最初に作成する方法は、
web.xml
である可能性があります.ServletContainerInitializer 구현체
に変更できます.その方法は別でしょう.WebApplicationInitializerインプリメンテーションjavaコード
public class WebInitializer implements WebApplicationInitializer{
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
...
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.setConfigLocation("com.studyspring.basic.config");
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", new DispatcherServlet(context));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
...
...
}
}
このコードは私がweb.xml
フォーマットをServletContainerInitializer
フォーマットに変更して作成したコードです.Tomcatのサーブレットコンテナが駆動されると、WebApplicationInitializerインタフェースを実装するクラスを検索し、onStartUp
メソッドを呼び出してWebアプリケーションのサーブレットコンテキストを作成および初期化します.onStartUp
メソッドを呼び出すと、DispatcherServlet
をダイナミックにSubetコンテキストに配置し、DispatcherServeretを生成するかどうかを確認できます.add
メソッドは、subliteインスタンスをaddServlet
に動的に追加するメソッドです.servletContext
コード部は、アプリケーションテキストを生成する意味として以下に説明する.スプリングコンテナを作成するとき
AnnotationConfigWebApplicationContext
はスプリング管理が組み込まれた空き箱です.スプリングコンテナは、Application Context
〜DispatcherServlet
の時点で生成される.2つのWebApplicationContextを使用して実装できます.
init
XmlWebApplicationContext
1.
AnnotationConfigWebApplicationContext
を使用して+2457912を実施2.
WebApplicationInitializer
を使用して+2457912を実施3.
XmlWebApplicationContext
設定+2457912を使用4.
WebApplicationInitializer
を使用して+2457912を設定現在の主流はニンジンWebApplicationInitializer実装+Javaプロファイル方式です.スプリングスタートもこの形のようです.
2番と3番について、実現方法を知りたいのですが、残りの応用はこれではあまり差がありません.
WebApplicationInitializer実装+n o t i o n t i o n C o n f i g WebApplicationContext方式
サーブレットContainerInitializerによって実装されるSpring Frameworkでは、サーバコンテキストを初期化し、DispacherServiceとApplicationContextの作成場所を表示します.
public class WebInitializer implements WebApplicationInitializer{
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
...
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.setConfigLocation("com.studyspring.basic.config");
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", new DispatcherServlet(context));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
...
...
}
}
TomcatのSublitコンテナが起動すると、AnnotationConfigWebApplicationContext
インタフェースを実装するクラスが検索され、web.xml
メソッドがWebアプリケーションのSublitコンテキストを作成および初期化するために呼び出されます.このコードでは、XmlWebApplicationContext
スプリングコンテナが生成され、javaプロファイルの位置を指定し、スプリングコンテナが生成されます.その後、パラメータとして
web.xml
を配置し、DispatcherServeretオブジェクトを作成し、AnnotationConfigWebApplicationContext
をServertコンテキストに動的に追加することができます.WebApplicationInitializer設定+onStartUpを使用
web.xml
...
...
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
...
...
servlet-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans ...>
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<context:component-scan base-package="com.studyspring.basic" />
</beans:beans>
AnnotationConfigWebApplicationContext
は、DispatcherServiceで使用されるWebApplicationContext Springコンテナを作成するためのプロファイルです.名前は必ずしもDispatcherServlet
ではない.DispatcherServlet
セクションにプロファイルのパスが追加された場合、DispatcherServiceletはその初期化時にweb.xml
を使用してスプリングコンテナを作成します.XmlWebApplicationContext
は何ですか、servlet-context.xml
は何ですかなど、以前の投稿[前の投稿]を参照してください.スプリングコンテナ階層
基本的に、スプリングには
servlet-context.xml
が存在する.普通はそんなことは起こらないけど、web.xmlを変更すると、DispatcherServiceletは複数存在します.
前述したように、DispatcherServiceletは初期化時にアプリケーションコンテキスト(スプリングコンテナ)を作成します.ここで使用するアプリケーションコンテキストはDispatcherServiceletでのみ使用できます.
複数のDispatcherServicelet共有が必要なApplicationContextがある場合があります.このとき使用されるのは
<init-param>
です.web.xmlでリスナーを使用する
<?xml version="1.0" encoding="UTF-8"?>
<web-app ...>
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
...
...
</web-app>
XmlWebApplicationContext
は、シーケンスバッチコンテキスト内のすべてのシーケンスバッチによって共有される変数を宣言する役割を果たす.<annotation-driven/>
で変数名を指定し、component-scan
で値を指定することで、すべてのサーブレットが値を抽出して使用できます.DispatcherServlet
を使用して、ContextLoaderListener
に名前を付けて、グローバルコンテナの作成時に読み込むApplicationContextプロファイルのパスを指定します.ここのプロファイル名は<context-param>
です.<param-name>
はクライアント要求を必要としないが、コンテナ起動時に<param-value>
のオブジェクトであり、シーケンスバッチコンテキストパラメータの<context-param>
名を持つパラメータからプロファイルパスを読み出すことにより、シーケンスバッチコンテキスト内のすべてのシーケンスバッチが共有されるグローバルcontextConfigLocation
を生成する.注意事項は上記の
root-context.xml
ですが、ContextLoaderListener
を別途設定しない場合は、Pre-Loading
ファイルの読み取りを基本的に試みます.ファイルがない場合は、スプリングコンテナが実行中にエラーが発生する可能性があります.WebApplicationInitializerインプリメンテーションでリスナーを使用する
web.xmlのみならず、WebApplicationInitializerインプリメンテーションでContextLoaderListenerを使用することもできます.
public class WebInitializer implements WebApplicationInitializer{
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
//각각 디스패처서블릿에서 사용할 ApplicationContext 여러개 생성
...
...
//DispacherServlet 여러개 생성 후 ApplicationContext 별도 지정
...
...
//공유할 ApplicationContext 별도 생성 및 리스너 등록
AnnotationConfigWebApplicationContext rootAppContext = new AnnotationConfigWebApplicationContext();
rootAppContext.register(RootAppContext.class);
ContextLoaderListener listener = new ContextLoaderListener(rootAppContext);
servletContext.addListener(listener);
...
}
}
コンテナは必ずしも階層を構成するとは限らない.DispatcherServiceletが1つしかない場合は、別途登録がなくてもSpring MVCは正常に動作します.コンテナが階層になったとき。
contextConfigLocation
毎に単独で使用されるApplication Context
をゾーンコンテナと呼び、<conetxt-param>
によって共有されるcontextConfigLoaction
をグローバルコンテナと呼ぶ.空探索では領域コンテナを優先的に確認し,なければグローバルコンテナへ探索する.そのため、埋め方があればエリアコンテナを優先します.
Reference
この問題について(DispatcherServiceletとスプリングコンテナ作成プロセス), 我々は、より多くの情報をここで見つけました https://velog.io/@suhongkim98/DispatcherServlet과-스프링-컨테이너-생성-과정テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol