178

プロジェクトで使用されているSpring Frameworkを学習しています。web.xmlファイルにContextLoaderListenerエントリが見つかりました 。しかし、それが開発者にどのように役立つかわかりませんか?

ContextLoaderListenerの公式ドキュメントでは、 WebApplicationContextを開始すると書かれています。WebApplicationContext JavaDocsについては、次のように述べています。

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


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

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

4

15 に答える 15

118

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

  1. ApplicationContextのライフサイクルをServletContextandのライフサイクルに結び付ける

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

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

于 2012-08-05T14:50:05.853 に答える
43

ContextLoaderListenerオプションですContextLoaderListenerここで指摘しておくと、Spring アプリケーションを構成せずweb.xmlに起動できますDispatcherServlet

これは次のようになります。

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

Beanをdispatcher-servlet.xml定義します。

<?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>
于 2014-03-09T00:23:38.383 に答える
24

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

<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の実際の初期化作業を実行することに注意してください。

この記事が非常に役立つことがわかりました: Spring MVC – アプリケーション コンテキストと Web アプリケーション コンテキスト

于 2016-02-26T20:25:41.917 に答える
10

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

それによると、Application-Contexts は階層的であるため、DispatcherServet のコンテキストは ContextLoaderListener のコンテキストの子になります。そのため、コントローラー レイヤー (Struts または Spring MVC) で使用されているテクノロジは、ContextLoaderListener を作成したルート コンテキストから独立できます。

于 2015-04-22T12:50:13.963 に答える
3

基本的に、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 ですべてのサービスとエンティティを構成する必要があります。

于 2016-08-09T18:51:42.013 に答える
3

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

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

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

于 2016-06-30T11:41:48.763 に答える
1

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

于 2016-08-10T14:50:09.437 に答える
1

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

ContextLoaderListener -

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

    <param-name>contextConfigLocation</param-name>  
    <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>  
    
于 2015-11-12T07:01:54.223 に答える
1

これにより、Web アプリケーションのデプロイ時に実行したいコードを配置するためのフック ポイントが得られます。

于 2012-08-05T09:32:08.267 に答える
0

ContextLoaderListener を使用せずに web.xml を記述すると、Spring セキュリティで customAuthenticationProvider を使用して認証を行うことはできません。DispatcherServelet は ContextLoaderListener の子コンテキストであるため、customAuthenticationProvider は ContextLoaderListener である parentContext の一部です。したがって、親コンテキストは子コンテキストの依存関係を持つことはできません。そのため、spring-context.xml を initparam に記述するのではなく、contextparam に記述することをお勧めします。

于 2014-05-30T07:15:10.693 に答える