ContextLoaderListener在Spring中的角色/用途?

我正在学习我的项目中使用的Spring Framework。 我在我的web.xml文件中找到了ContextLoaderListener条目。 但无法弄清楚它对开发人员有何帮助?

在ContextLoaderListener的官方文档中,它表示它将启动WebApplicationContext。 关于WebApplicationContext JavaDocs说:

提供Web应用程序配置的接口。


但是我无法理解我用ContextLoaderListener实现的内部初始化WebApplicationContext的功能?

根据我的理解 ,ContextLoaderListener读取Spring配置文件(对web.xml中的contextConfigLocation赋予值),解析它并加载在该配置文件中定义的单例bean。 同样,当我们要加载原型bean时,我们将使用相同的web应用上下文来加载它。 因此,我们使用ContextLoaderListener初始化web应用程序,以便我们提前读取/解析/验证配置文件,并且无论何时我们要注入依赖关系,我们都可以毫不拖延地直接执行它。 这种理解是否正确?


你的理解是正确的。 ApplicationContext是Spring bean所在的地方。 ContextLoaderListener的目的有两个:

  • ApplicationContext的生命周期与ServletContext和的生命周期联系起来

  • 自动创建ApplicationContext ,所以你不必编写显式代码来创建它 - 这是一个方便的功能。

  • 关于ContextLoaderListener另一个方便之处是它创建了一个WebApplicationContextWebApplicationContext通过ServletContextAware bean和getServletContext方法提供对ServletContext访问。


    ContextLoaderListener是可选的。 只需要在这里指出一点:您可以启动Spring应用程序,而无需配置ContextLoaderListener ,只需使用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下添加此文件。

    调度员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>
    

    对于更复杂的Spring应用程序,如果您定义了多个DispatcherServlet ,则可以使用ContextLoaderListener定义的所有DispatcherServlet共享的常见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应用程序上下文执行实际的初始化工作。

    我发现这篇文章有很多帮助:Spring MVC - 应用程序上下文与Web应用程序上下文

    链接地址: http://www.djcxy.com/p/14391.html

    上一篇: Role/Purpose of ContextLoaderListener in Spring?

    下一篇: 303 dependency injection and Hibernate