私はプロジェクトで使用されているSpring Frameworkを学んでいます。 web.xmlファイルにContextLoaderListenerエントリが見つかりました。しかし、それが開発者にとってどれほど正確に役立つのか理解できませんでしたか?
ContextLoaderListener の公式ドキュメントでは、WebApplicationContextを起動するように指定されています。 WebApplicationContext JavaDocsは言う:
Webアプリケーションの構成を提供するインターフェイス。
しかし、WebApplicationContextを内部的に初期化するContextLoaderListenerで達成していることを理解できませんか?
私の理解によると、ContextLoaderListenerはSpring構成ファイルを読み取ります(webのcontextConfigLocationに対して指定された値で) .xml)、それを解析し、その構成ファイルで定義されたsingleton beanをロードします。同様に、prototype Beanをロードする場合、同じWebアプリケーションコンテキストを使用してロードします。そのため、事前に構成ファイルを読み取り/解析/検証し、依存関係を挿入する場合はすぐにすぐに実行できるように、ContextLoaderListenerでWebアプリケーションを初期化します。この理解は正しいですか?
あなたの理解は正しいです。 ApplicationContext
は、Spring Beanが存在する場所です。 ContextLoaderListener
の目的は2つあります。
ApplicationContext
のライフサイクルをServletContext
のライフサイクルに関連付ける
ApplicationContext
の作成を自動化するため、明示的なコードを作成して作成する必要はありません-これは便利な関数です。
ContextLoaderListener
のもう1つの便利な点は、WebApplicationContext
を作成し、WebApplicationContext
が ServletContext
BeanとServletContextAware
メソッドを介してgetServletContext
へのアクセスを提供することです。
ContextLoaderListener
はoptionalです。ここで要点を説明します。ContextLoaderListener
を設定することなく、Springアプリケーションを起動できます。DispatcherServlet
を使用した基本的な最小web.xml
.
これは次のようになります。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://Java.Sun.com/xml/ns/javaee"
xmlns:web="http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="
http://Java.Sun.com/xml/ns/javaee
http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID"
version="2.5">
<display-name>Some Minimal Webapp</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
dispatcher-servlet.xml
というファイルを作成し、WEB-INF
の下に保存します。ようこそリストでindex.jsp
に言及したので、このファイルをWEB-INF
の下に追加します。
dispatcher-servlet.xml
dispatcher-servlet.xml
で、Beanを定義します。
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="bean1">
...
</bean>
<bean id="bean2">
...
</bean>
<context:component-scan base-package="com.example" />
<!-- Import your other configuration files too -->
<import resource="other-configs.xml"/>
<import resource="some-other-config.xml"/>
<!-- View Resolver -->
<bean
id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property
name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
単純なSpringアプリケーションの場合、web.xml
でContextLoaderListener
を定義する必要はありません。すべてのSpring構成ファイルを<servlet>
に入れることができます。
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/mvc-core-config.xml, classpath:spring/business-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
複数のDispatcherServlet
が定義されているより複雑なSpringアプリケーションの場合、DispatcherServlet
で定義されているすべてのContextLoaderListener
で共有される共通のSpring設定ファイルを使用できます。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/common-config.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>mvc1</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/mvc1-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>mvc2</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/mvc2-config.xmll</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
ContextLoaderListener
は、rootアプリケーションコンテキストの実際の初期化作業を実行することに注意してください。
この記事は非常に役立つことがわかりました: Spring MVC – Application Context vs Web Application Context
ブログ「 ContextLoaderListenerの目的– Spring MVC 」は非常に良い説明を提供します。
それによると、アプリケーションコンテキストは階層的であるため、DispatcherSerlvetのコンテキストはContextLoaderListenerのコンテキストの子になります。そのため、コントローラーレイヤー(StrutsまたはSpring MVC)で使用されている技術は、ContextLoaderListenerで作成されたルートコンテキストに依存しません。
デフォルトの命名規則[servletname]-servlet.xml
およびWeb-INF/
の下のパスではなく、カスタムの場所またはカスタム名でサーブレットファイルを配置する場合は、ContextLoaderListener
を使用できます。
ContextLoaderListnerは、すべての異なる構成ファイル(サービスレイヤー構成、永続化レイヤー構成など)を単一のスプリングアプリケーションコンテキストにロードするサーブレットリスナーです。
これは、複数のXMLファイルにスプリング構成を分割するのに役立ちます。
コンテキストファイルがロードされると、SpringはBean定義に基づいてWebApplicationContextオブジェクトを作成し、WebアプリケーションのServletContextに保存します。
このBootstrapリスナーは、SpringのrootWebApplicationContextを起動およびシャットダウンします。 Webアプリケーションは複数のディスパッチャサーブレットを持つことができ、それぞれにコントローラ、ビューリゾルバ、ハンドラマッピングなどを含む独自のアプリケーションコンテキストがありますが、ルートアプリケーションコンテキストにサービスBean、DAO Beanがあり、すべての子アプリケーションコンテキストで使用したい場合があります(ディスパッチャサーブレットによって作成されたアプリケーションコンテキスト)。
このリスナーの2番目の使用法は、スプリングセキュリティを使用する場合です。
基本的に、ContextLoaderListnerを使用してルートアプリケーションコンテキストとWebアプリケーションコンテキストを分離できます。
Context paramでマップされた構成ファイルは、ルートアプリケーションコンテキスト構成として動作します。また、ディスパッチャサーブレットでマップされた構成ファイルは、Webアプリケーションコンテキストのように動作します。
どのWebアプリケーションでも、複数のディスパッチャサーブレットがあるため、複数のWebアプリケーションコンテキストがあります。
ただし、どのWebアプリケーションでも、すべてのWebアプリケーションコンテキストと共有されるルートアプリケーションコンテキストは1つだけです。
ルートアプリケーションコンテキストで共通のサービス、エンティティ、アスペクトなどを定義する必要があります。また、コントローラー、インターセプターなどは、関連するWebアプリケーションのコンテキストにあります。
サンプルweb.xmlは
<!-- language: xml -->
<web-app>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>example.config.AppConfig</param-value>
</context-param>
<servlet>
<servlet-name>restEntryPoint</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>example.config.RestConfig</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>restEntryPoint</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>webEntryPoint</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>example.config.WebConfig</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>webEntryPoint</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
ここで、構成クラスexample.config.AppConfigを使用して、他のすべてのWebアプリケーションコンテキストと共有されるルートアプリケーションコンテキストでサービス、エンティティ、アスペクトなどを構成できます(たとえば、ここには2つのWebアプリケーションコンテキスト構成クラスRestConfigとWebConfigがあります)
PS:ここで、ContextLoaderListenerは完全にオプションです。ここでweb.xmlでContextLoaderListenerに言及しない場合、AppConfigは機能しません。その場合、すべてのサービスとエンティティをWebConfigとRest Configで構成する必要があります。
Webアプリケーションのデプロイ時に実行するコードを配置するためのポイントを提供します
ContextLoaderListenerを使用せずにweb.xmlを作成する場合、springセキュリティでcustomAuthenticationProviderを使用して認証を行うことはできません。 DispatcherServeletはContextLoaderListenerの子コンテキストであるため、customAuthenticationProviderはContextLoaderListenerであるparentContextの一部です。したがって、親コンテキストは子コンテキストの依存関係を持つことができません。したがって、initparamで記述する代わりにcontextparamでspring-context.xmlを記述するのがベストプラクティスです。
複数の設定ファイルが必要な場合や、たとえばapplicationcontext.xmlの代わりにxyz.xmlファイルがある場合に、実際に使用されると思います
<context-param><param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/training-service.xml, /WEB-INF/training-data.xml</param-value> </context-param>
ContextLoaderListenerへの別のアプローチは、以下のようなContextLoaderServletを使用することです
<servlet> <servlet-name>context</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
Springフレームワークのコンテキストでは、ContextLoaderListenerの目的は、アプリケーションのバックエンドを駆動する中間層およびデータ層コンポーネントなど、アプリケーションの他のBeanをロードすることです。
リスナークラス-イベントをリッスンします(たとえば、サーバーの起動/シャットダウン)
ContextLoaderListener-
構成ファイルはweb.xmlでこのように提供できます
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
あなたの理解は正しいです。 ContextLoaderListenerに利点がないのはなぜかと思います。たとえば、(データベースを管理するために)セッションファクトリを構築する必要があります。この操作には時間がかかることがあるため、起動時に実行することをお勧めします。もちろん、initサーブレットなどを使用してそれを行うことができますが、Springのアプローチの利点は、コードを記述せずに構成を行うことです。