[java] 스프링에서 ContextLoaderListener의 역할 / 목적?
내 프로젝트에서 사용중인 Spring Framework 를 배우고 있습니다. web.xml 파일 에서 ContextLoaderListener 항목을 찾았습니다 . 그러나 그것이 개발자에게 정확히 어떻게 도움이되는지 알 수 없었습니까?
ContextLoaderListener 의 공식 문서에서 WebApplicationContext 를 시작한다고 말합니다 . WebApplicationContext 와 관련하여 JavaDocs는 다음 과 같이 말합니다.
웹 애플리케이션을위한 구성을 제공하기위한 인터페이스.
그러나 WebApplicationContext 를 내부적으로 초기화하는 ContextLoaderListener 로 달성 한 것을 이해할 수 없습니다 .
내 이해에 따라 ContextLoaderListener 는 Spring 구성 파일 ( web.xml의 contextConfigLocation에 제공된 값으로)을 읽고 구문 분석 한 다음 해당 구성 파일에 정의 된 싱글 톤 Bean을 로드 합니다. 마찬가지로 prototype bean 을로드 할 때 동일한 웹 애플리케이션 컨텍스트를 사용하여로드합니다. 따라서 ContextLoaderListener를 사용 하여 웹 응용 프로그램을 초기화하여 구성 파일을 미리 읽거나 구문 분석 / 확인하고 종속성을 주입하려고 할 때마다 지연없이 바로 수행 할 수 있습니다. 이 이해가 맞습니까?
답변
이해가 정확합니다. 는 ApplicationContext
귀하의 봄 콩이 사는 곳이다. 의 목적 ContextLoaderListener
은 두 가지입니다.
-
의주기 넥타이
ApplicationContext
의 라이프 사이클에ServletContext
및 -
의 생성을 자동화
ApplicationContext
하기 위해 명시 적 코드를 작성할 필요가 없습니다. 편의 기능입니다.
에 대한 또 다른 편리한 점은 비아 빈과 메소드에 대한 액세스를 제공 하고 제공 ContextLoaderListener
한다는 것 입니다.WebApplicationContext
WebApplicationContext
ServletContext
ServletContextAware
getServletContext
답변
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에 저장합니다.