web-dev-qa-db-ja.com

SpringのContextLoaderListenerの役割/目的は?

私はプロジェクトで使用されているSpring Frameworkを学んでいます。 web.xmlファイルにContextLoaderListenerエントリが見つかりました。しかし、それが開発者にとってどれほど正確に役立つのか理解できませんでしたか?

ContextLoaderListener の公式ドキュメントでは、WebApplicationContextを起動するように指定されています。 WebApplicationContext JavaDocsは言う:

Webアプリケーションの構成を提供するインターフェイス。


しかし、WebApplicationContextを内部的に初期化するContextLoaderListenerで達成していることを理解できませんか?

私の理解によるとContextLoaderListenerはSpring構成ファイルを読み取ります(webのcontextConfigLocationに対して指定された値で) .xml)、それを解析し、その構成ファイルで定義されたsingleton beanをロードします。同様に、prototype Beanをロードする場合、同じWebアプリケーションコンテキストを使用してロードします。そのため、事前に構成ファイルを読み取り/解析/検証し、依存関係を挿入する場合はすぐにすぐに実行できるように、ContextLoaderListenerでWebアプリケーションを初期化します。この理解は正しいですか?

157
M Sach

あなたの理解は正しいです。 ApplicationContextは、Spring Beanが存在する場所です。 ContextLoaderListenerの目的は2つあります。

  1. ApplicationContextのライフサイクルをServletContextのライフサイクルに関連付ける

  2. ApplicationContextの作成を自動化するため、明示的なコードを作成して作成する必要はありません-これは便利な関数です。

ContextLoaderListenerのもう1つの便利な点は、WebApplicationContextを作成し、WebApplicationContextServletContext BeanとServletContextAwareメソッドを介してgetServletContextへのアクセスを提供することです。

101
sourcedelica

ContextLoaderListeneroptionalです。ここで要点を説明します。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>
40
Vikram

単純なSpringアプリケーションの場合、web.xmlContextLoaderListenerを定義する必要はありません。すべての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

23
xli

ブログ「 ContextLoaderListenerの目的– Spring MVC 」は非常に良い説明を提供します。

それによると、アプリケーションコンテキストは階層的であるため、DispatcherSerlvetのコンテキストはContextLoaderListenerのコンテキストの子になります。そのため、コントローラーレイヤー(StrutsまたはSpring MVC)で使用されている技術は、ContextLoaderListenerで作成されたルートコンテキストに依存しません。

10
Dileepa

デフォルトの命名規則[servletname]-servlet.xmlおよびWeb-INF/の下のパスではなく、カスタムの場所またはカスタム名でサーブレットファイルを配置する場合は、ContextLoaderListenerを使用できます。

3
Dungeon_master

ContextLoaderListnerは、すべての異なる構成ファイル(サービスレイヤー構成、永続化レイヤー構成など)を単一のスプリングアプリケーションコンテキストにロードするサーブレットリスナーです。

これは、複数のXMLファイルにスプリング構成を分割するのに役立ちます。

コンテキストファイルがロードされると、SpringはBean定義に基づいてWebApplicationContextオブジェクトを作成し、WebアプリケーションのServletContextに保存します。

3
Prashant_M

enter image description here このBootstrapリスナーは、SpringのrootWebApplicationContextを起動およびシャットダウンします。 Webアプリケーションは複数のディスパッチャサーブレットを持つことができ、それぞれにコントローラ、ビューリゾルバ、ハンドラマッピングなどを含む独自のアプリケーションコンテキストがありますが、ルートアプリケーションコンテキストにサービスBean、DAO Beanがあり、すべての子アプリケーションコンテキストで使用したい場合があります(ディスパッチャサーブレットによって作成されたアプリケーションコンテキスト)。

このリスナーの2番目の使用法は、スプリングセキュリティを使用する場合です。

2
rulhaniam

基本的に、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で構成する必要があります。

2
Anil Agrawal

Webアプリケーションのデプロイ時に実行するコードを配置するためのポイントを提供します

1
Jigar Joshi

ContextLoaderListenerを使用せずにweb.xmlを作成する場合、springセキュリティでcustomAuthenticationProviderを使用して認証を行うことはできません。 DispatcherServeletはContextLoaderListenerの子コンテキストであるため、customAuthenticationProviderはContextLoaderListenerであるparentContextの一部です。したがって、親コンテキストは子コンテキストの依存関係を持つことができません。したがって、initparamで記述する代わりにcontextparamでspring-context.xmlを記述するのがベストプラクティスです。

0
SathishSakthi

複数の設定ファイルが必要な場合や、たとえば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>

0
user666

Springフレームワークのコンテキストでは、ContextLoaderListenerの目的は、アプリケーションのバックエンドを駆動する中間層およびデータ層コンポーネントなど、アプリケーションの他のBeanをロードすることです。

0
Salahin Rocky

リスナークラス-イベントをリッスンします(たとえば、サーバーの起動/シャットダウン)

ContextLoaderListener-

  1. サーバーの起動/シャットダウン中にリッスンします
  2. Spring構成ファイルを入力として受け取り、構成に従ってBeanを作成して準備します(シャットダウン中にBeanを破棄します)
  3. 構成ファイルはweb.xmlでこのように提供できます

    <param-name>contextConfigLocation</param-name>  
    <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>  
    
0
bharanitharan

あなたの理解は正しいです。 ContextLoaderListenerに利点がないのはなぜかと思います。たとえば、(データベースを管理するために)セッションファクトリを構築する必要があります。この操作には時間がかかることがあるため、起動時に実行することをお勧めします。もちろん、initサーブレットなどを使用してそれを行うことができますが、Springのアプローチの利点は、コードを記述せずに構成を行うことです。

0
evg