[java] 스프링에서 ContextLoaderListener의 역할 / 목적?

내 프로젝트에서 사용중인 Spring Framework 를 배우고 있습니다. web.xml 파일 에서 ContextLoaderListener 항목을 찾았습니다 . 그러나 그것이 개발자에게 정확히 어떻게 도움이되는지 알 수 없었습니까?

ContextLoaderListener 의 공식 문서에서 WebApplicationContext 를 시작한다고 말합니다 . WebApplicationContext 와 관련하여 JavaDocs는 다음 과 같이 말합니다.

웹 애플리케이션을위한 구성을 제공하기위한 인터페이스.

그러나 WebApplicationContext 를 내부적으로 초기화하는 ContextLoaderListener 로 달성 한 것을 이해할 수 없습니다 .

내 이해에 따라 ContextLoaderListener 는 Spring 구성 파일 ( web.xml의 contextConfigLocation에 제공된 값으로)을 읽고 구문 분석 한 다음 해당 구성 파일에 정의 된 싱글 톤 Bean을 로드 합니다. 마찬가지로 prototype bean 을로드 할 때 동일한 웹 애플리케이션 컨텍스트를 사용하여로드합니다. 따라서 ContextLoaderListener를 사용 하여 웹 응용 프로그램을 초기화하여 구성 파일을 미리 읽거나 구문 분석 / 확인하고 종속성을 주입하려고 할 때마다 지연없이 바로 수행 할 수 있습니다. 이 이해가 맞습니까?



답변

이해가 정확합니다. 는 ApplicationContext귀하의 봄 콩이 사는 곳이다. 의 목적 ContextLoaderListener은 두 가지입니다.

  1. 의주기 넥타이 ApplicationContext의 라이프 사이클에 ServletContext

  2. 의 생성을 자동화 ApplicationContext하기 위해 명시 적 코드를 작성할 필요가 없습니다. 편의 기능입니다.

에 대한 또 다른 편리한 점은 비아 빈과 메소드에 대한 액세스를 제공 하고 제공 ContextLoaderListener한다는 것 입니다.WebApplicationContextWebApplicationContextServletContextServletContextAwaregetServletContext


답변

ContextLoaderListener이다 선택 . 그냥 여기에 포인트로 만들려면 : 혹시 구성하지 않고 Spring 애플리케이션을 부팅 할 수 있습니다 ContextLoaderListener, 단지 기본 최소 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

에서 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 애플리케이션의 경우 ; ContextLoaderListener에서 정의 할 필요가 없습니다 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>

여러 한 더 복잡한 Spring 애플리케이션의 경우, DispatcherServlet정의, 당신은 모두가 공유하는 공통의 봄 구성 파일 수 DispatcherServlet에 정의를 ContextLoaderListener:

<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하고 루트에 대한 실제 초기화 작업을 수행하십시오. 응용 프로그램 컨텍스트에 .

:이 기사가 많은 도움이 발견
웹 응용 프로그램 컨텍스트 대 응용 프로그램 컨텍스트 – 스프링 MVC를


답변

블로그 ” ContextLoaderListener의 목적 – Spring MVC “는 아주 좋은 설명을 제공합니다.

이에 따르면 Application-Contexts는 계층 적이므로 DispatcherSerlvet의 컨텍스트는 ContextLoaderListener의 컨텍스트의 하위가됩니다. 그로 인해 컨트롤러 계층 (Struts 또는 Spring MVC)에서 사용되는 기술은 루트 컨텍스트 생성 ContextLoaderListener와 독립적 일 수 있습니다.


답변

기본 이름 지정 규칙 [servletname]-servlet.xml및 경로가 아닌 사용자 정의 위치 또는 사용자 정의 이름으로 서블릿 파일을 저장하려는 경우을 Web-INF/사용할 수 있습니다 ContextLoaderListener.


답변

ContextLoaderListner는 모든 다른 구성 파일 (서비스 계층 구성, 지속성 계층 구성 등)을 단일 스프링 애플리케이션 컨텍스트로로드하는 서블릿 리스너입니다.

이를 통해 스프링 구성을 여러 XML 파일로 분할 할 수 있습니다.

컨텍스트 파일이로드되면 Spring은 Bean 정의를 기반으로 WebApplicationContext 객체를 생성하고이를 웹 애플리케이션의 ServletContext에 저장합니다.


답변

여기에 이미지 설명을 입력하십시오이 부트 스트랩 리스너는 Spring의 루트 WebApplicationContext 를 시작하고 종료하는 것 입니다. 웹 애플리케이션은 여러 디스패처 서블릿을 가질 수 있고 각각 컨트롤러, 뷰 리졸버, 핸들러 맵핑을 포함하는 자체 애플리케이션 컨텍스트를 가질 수 있지만 루트 애플리케이션 컨텍스트에 서비스 Bean, DAO Bean을 갖고 모든 하위 애플리케이션 컨텍스트에서 사용하려고 할 수 있습니다. 디스패처 서블릿으로 작성된 애플리케이션 컨텍스트).

이 리스너의 두 번째 사용은 스프링 보안을 사용하려는 경우입니다.