봄철 ContextLoaderListener의 역할/목적
저는 제 프로젝트에서 사용하고 있는 스프링 프레임워크를 배우고 있습니다.web.xml 파일에서 ContextLoaderListener 엔트리를 찾았습니다.하지만 그것이 개발자에게 정확히 어떤 도움이 되는지 알 수 없었나요?
ContextLoaderListener의 공식 문서에는 WebApplicationContext를 시작하는 것으로 기재되어 있습니다.Web 어플 Context JavaDocs에 대해 다음과 같이 말합니다.
웹 응용 프로그램의 설정을 제공하는 인터페이스입니다.
그러나 내부적으로 Web Application Context를 초기화하는 Context Loader Listener에서 무엇을 달성하고 있는지 이해할 수 없습니다.
ContextLoaderListener는 스프링컨피규레이션파일(web.xml의 contextConfigLocation에 대해 지정된 값)을 읽고 이를 해석하여 해당 Configuration파일에 정의된 싱글톤빈을 로드합니다.마찬가지로 시제품 bean을 로드하는 경우에도 동일한 웹 애플리케이션 컨텍스트를 사용하여 로드합니다.따라서 ContextLoaderListener를 사용하여 웹 어플리케이션을 초기화하여 컨피규레이션파일을 미리 읽고 해석하고 검증합니다.의존관계를 주입하고 싶을 때는 언제든지 지체 없이 바로 실행할 수 있습니다.이 이해가 맞습니까?
당신의 이해는 옳습니다.ApplicationContext
의 목적. of of의 ContextLoaderListener
겹으로 나누다 2겹으로 나누다.
ApplicationContext
ServletContext
...동동의
ApplicationContext
따라서 작성 시 명시적인 코드를 쓸 필요가 없습니다.이것은 편리한 기능입니다.
또 다른 편리한 점은ContextLoaderListener
하면 '나', '나', '나', '나'가 됩니다.WebApplicationContext
에 할 수 .ServletContext
콩과 를 통해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
리스트에서 이 을 [Welcome List합니다.WEB-INF
.
dispatcher-servlet.xml
서서 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>
에서는 Spring을 .ContextLoaderListener
안에서web.xml
을 에 수 있습니다.<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 개의 Spring 어플리케이션이 어플리케이션에서는 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>
명,, just just just,ContextLoaderListener
는 루트 어플리케이션콘텍스트의 실제 초기화 작업을 수행합니다.
이 기사는 많은 도움이 되었습니다.봄 MVC – Application Context vs Web Application Context
블로그 "Purpose of Context Loader Listener – Spring MVC"는 매우 좋은 설명을 제공합니다.
이에 따르면 Application-Contexts는 계층적이기 때문에 DispatcherSerlvet의 컨텍스트는 ContextLoaderListener 컨텍스트의 하위 컨텍스트가 됩니다.이로 인해 컨트롤러 레이어(Struts 또는 Spring MVC)에서 사용되는 테크놀로지는 루트 컨텍스트가 작성한 ContextLoaderListener와는 무관할 수 있습니다.
루트 콘텍스트와 자 콘텍스트를 자세히 읽기 전에 다음 사항을 이해해 주십시오.
봄은 한 번에 여러 개의 콘텍스트를 가질 수 있습니다.그 중 하나는 루트콘텍스트가 되고 다른 모든 콘텍스트는 자녀 콘텍스트가 됩니다.
모든 자녀 콘텍스트가 루트 콘텍스트에 정의된 콩에 액세스할 수 있지만 그 반대는 아닙니다.루트 컨텍스트는 하위 컨텍스트 콩에 액세스할 수 없습니다.
응용 프로그램 컨텍스트:
applicationContext.xml은 모든 웹 응용 프로그램의 루트 컨텍스트 설정입니다.스프링은 applicationContext.xml 파일을 로드하고 애플리케이션 전체의 ApplicationContext를 만듭니다.웹 응용 프로그램마다 하나의 응용 프로그램 컨텍스트만 있습니다.contextConfigLocation 파라미터를 사용하여 web.xml에서 컨텍스트컨피규레이션파일명을 명시적으로 선언하지 않으면 Spring은 WEB-INF 폴더에서 applicationContext.xml을 검색하여 이 파일을 찾을 수 없는 경우 FileNotFoundException을 슬로우합니다.
ContextLoaderListener 루트 응용 프로그램콘텍스트의 실제 초기화 작업을 수행합니다."contextConfigLocation" 컨텍스트 패램을 읽고 그 값을 컨텍스트인스턴스에 전달합니다.이 패스를 여러 개의 쉼표와 공간으로 구분할 수 있습니다(예: "WEB-INF/applicationContext1.xml, WEB-INF/applicationContext2.xml).ContextLoaderListener는 옵션입니다.요점만 말씀드리면 ContextLoaderListener를 설정하지 않고 스프링 어플리케이션을 부팅할 수 있습니다.이것은 DispatcherServlet을 사용하는 기본적인 최소 web.xml 입니다.
DispatcherServlet DispatcherServlet은 기본적으로 설정된 URL 패턴에 일치하는 착신 Web 요구를 처리하는 것이 주된 목적인 Servlet(HttpServlet 확장)입니다.착신 URI 를 취득해, 컨트롤러와 뷰의 적절한 편성을 찾습니다.전면 컨트롤러입니다.
스프링 설정에서 Dispatcher Servlet을 정의하는 경우 contextConfigLocation 속성을 사용하여 컨트롤러 클래스, 뷰 매핑 등의 엔트리가 포함된 XML 파일을 제공합니다.
Web Application Context Application Context Application Context와는 별도로 단일 웹 응용 프로그램에 여러 개의 Web Application Context가 있을 수 있습니다.간단히 말하면, 각 DispatcherServlet은 단일 WebApplicationContext와 관련지어집니다.xxx-servlet.xml 파일은 DispatcherServlet 고유하며 웹 응용 프로그램에는 요청을 처리하도록 여러 DispatcherServlet을 설정할 수 있습니다.이러한 시나리오에서는 각 DispatcherServlet에 개별 xxx-servlet.xml이 설정됩니다.단, applicationContext.xml은 모든 서블릿컨피규레이션파일에 공통입니다.Spring은 기본적으로 webapps WEB-INF 폴더에서 "xx-servlet.xml"이라는 이름의 파일을 로드합니다.여기서 xxx는 web.xml의 서블릿 이름입니다.해당 파일 이름 또는 위치를 변경할 경우 contextConfigLocation을 파라미터 이름으로 사용하여 initi-param을 추가합니다.
비교 및 관계:
ContextLoaderListener vs DispatcherServlet
ContextLoaderListener는 루트 응용 프로그램콘텍스트를 만듭니다.DispatcherServlet 엔트리는 서블릿엔트리마다 1개의 자녀 어플리케이션콘텍스트를 만듭니다.자 컨텍스트는 루트 컨텍스트에서 정의된 콩에 액세스할 수 있습니다.루트 콘텍스트의 콩은 자녀 콘텍스트의 콩에 직접 액세스 할 수 없습니다.모든 컨텍스트가 Servlet Context에 추가됩니다.Web Application Context Utils 클래스를 사용하여 루트 컨텍스트에 액세스할 수 있습니다.
스프링 매뉴얼을 읽으면 다음 사항을 이해할 수 있습니다.
a) Application-Context는 계층형이며 Web Application Contexts도 계층형입니다.여기를 참조해 주세요.
b) ContextLoaderListener는 웹 응용 프로그램의 루트 웹 응용 프로그램콘텍스트를 생성하여 ServletContext에 넣습니다.이 컨텍스트는 컨트롤러 레이어에서 사용되는 테크놀로지(Struts 또는 Spring MVC)에 관계없이 스프링 관리 대상 콩을 로드 및 언로드하는 데 사용할 수 있습니다.
c) Dispatcher Servlet은 자체 Web Application Context를 만들고 핸들러/컨트롤러/뷰 리졸버는 이 컨텍스트에서 관리합니다.
d) ContextLoaderListener가 DispatcherServlet과 함께 사용되는 경우 앞서 설명한 바와 같이 루트 web-application-context가 먼저 생성되고 하위 컨텍스트도 DispatcherSerlvet에 의해 생성되어 루트 애플리케이션 컨텍스트에 연결됩니다.여기를 참조해 주세요.
Spring MVC를 사용하여 서비스 계층에서 Spring을 사용하는 경우 2개의 애플리케이션 컨텍스트를 제공합니다.첫 번째는 ContextLoaderListener를 사용하여 설정하고 다른 하나는 DispatcherServlet을 사용하여 설정합니다.
일반적으로 ContextLoaderListener에 의해 DispatcherServlet 컨텍스트에서 MVC 관련 콩(컨트롤러 및 뷰 등)을 모두 정의하고 루트 컨텍스트에서 보안, 트랜잭션, 서비스 등의 모든 교차 콩을 정의합니다.
상세한 것에 대하여는, https://siddharthnawani.blogspot.com/2019/10/contextloaderlistener-vs.html 를 참조해 주세요.
ContextLoaderListner는 모든 다른 컨피규레이션파일(서비스층 컨피규레이션, 퍼시스텐스층 컨피규레이션 등)을 싱글스프링 애플리케이션콘텍스트에 로드하는 Servlet 리스너입니다
이를 통해 스프링 구성을 여러 XML 파일로 분할할 수 있습니다.
컨텍스트 파일이 로드되면 Spring은 bean 정의에 따라 Web Application Context 개체를 생성하여 웹 응용 프로그램의 Servlet Context에 저장합니다.
기본적으로 ContextLoaderListner를 사용하여 루트어플리케이션콘텍스트와 웹 어플리케이션콘텍스트를 분리할 수 있습니다.
context param을 사용하여 매핑된 Configuration파일은 루트애플리케이션 컨텍스트컨피규레이션으로 동작합니다.또한 디스패처 서블릿으로 매핑된 구성 파일은 웹 애플리케이션 컨텍스트와 동일하게 동작합니다.
웹 어플리케이션에서는 디스패처 서블릿이 여러 개 있을 수 있으므로 웹 어플리케이션 컨텍스트가 여러 개 있습니다.
단, 웹 어플리케이션에서는 모든 웹 어플리케이션콘텍스트와 공유되는 루트 어플리케이션컨텍스트는 1개뿐일 수 있습니다.
루트 애플리케이션 컨텍스트에서 공통 서비스, 엔티티, 측면 등을 정의해야 합니다.컨트롤러, 인터셉터 등은 관련 웹 애플리케이션 컨텍스트에 있습니다.
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>
config 클래스 example.config 를 나타냅니다.AppConfig를 사용하여 다른 모든 웹 응용 프로그램콘텍스트와 공유되는 루트 응용 프로그램콘텍스트에서 서비스, 엔티티, 애스펙트 등을 설정할 수 있습니다(예를 들어 여기에는 2개의 웹 응용 프로그램콘텍스트 컨피규레이션클래스 RestConfig와 WebConfig가 있습니다).
PS: 여기서는 Context Loader Listener는 완전히 옵션입니다.여기서 web.xml에서 ContextLoaderListener를 언급하지 않으면 AppConfig는 작동하지 않습니다.이 경우 WebConfig 및 Rest Config에서 모든 서비스와 엔티티를 설정해야 합니다.
이 부트스트랩청취자는 Spring의 루트 Web Application Context를 시작 및 종료합니다.웹 어플리케이션은 여러 디스패처 서블릿을 가질 수 있으며 각각 컨트롤러, 뷰 리졸바, 핸들러 매핑 등을 포함하는 자체 어플리케이션 컨텍스트를 가질 수 있습니다.단, 서비스 빈, DAO 빈을 루트 어플리케이션 컨텍스트에 두고 모든 자 어플리케이션 컨텍스트(디스패처 서블릿에 의해 작성된 어플리케이션 컨텍스트)에서 사용할 수 있습니다.
이 청취자의 두 번째 용도는 스프링 보안을 사용하는 경우입니다.
기본 이름 지정 규칙이 아닌 사용자 지정 위치 또는 사용자 지정 이름으로 Servlet 파일을 저장하려는 경우[servletname]-servlet.xml
및 경로 아래Web-INF/
를 사용할 수 있습니다.ContextLoaderListener
.
웹 어플리케이션 전개 시에 실행할 코드를 입력하기 위한 포인트 오브 훅이 제공됩니다.
Listener class - 이벤트에서 청취합니다(예:..서버 부팅/셧다운)
Context Loader Listener -
- 서버 시작/종료 시 리슨
- 스프링 구성 파일을 입력으로 가져와 구성에 따라 콩을 생성하여 준비합니다(셧다운 시 콩을 파기).
컨피규레이션파일은 web.xml 에서 다음과 같이 제공할 수 있습니다.
<param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
Context Loader Listener의 봄 프레임워크의 목적은 응용 프로그램의 백엔드를 구동하는 중간 계층 및 데이터 계층 컴포넌트 등 응용 프로그램의 다른 콩을 로드하는 것입니다.
당신의 이해는 옳습니다.Context Loader Listener에는 왜 이점이 없는지 궁금합니다.예를 들어 (데이터베이스 관리를 위해) 세션팩토리를 구축해야 합니다.이 작업은 시간이 걸릴 수 있으므로 시작 시 수행하는 것이 좋습니다.물론 init servlet이나 다른 것으로도 할 수 있지만, Spring의 어프로치의 장점은 코드를 쓰지 않고 설정을 할 수 있다는 것입니다.
ContextLoaderListener를 사용하지 않고 web.xml을 쓰면 커스텀을 사용하여 athuntation을 할 수 없습니다.Authentication Provider in spring security.DispatcherServelet은 ContextLoaderListener의 자녀 컨텍스트이므로 커스텀Authentication Provider는 ContextLoaderListener인 parentContext의 일부입니다.따라서 부모 콘텍스트는 자녀 콘텍스트의 종속성을 가질 수 없습니다.따라서 spring-context.xml을 initparam에 쓰는 것이 아니라 context.xml에 쓰는 것이 좋습니다.
이 기능은 여러 구성 파일을 가지고 있거나 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>
언급URL : https://stackoverflow.com/questions/11815339/role-purpose-of-contextloaderlistener-in-spring
'programing' 카테고리의 다른 글
PHP 정규식:끝 구분 기호 '^'을(를) 찾을 수 없습니다. (0) | 2023.01.13 |
---|---|
PHP 배열의 각 항목에 접두사 추가 (0) | 2023.01.13 |
Python에서의 메타클래스는 무엇입니까? (0) | 2023.01.13 |
도커 컨테이너에 스키마가 있는 MySQL 데이터베이스를 초기화하려면 어떻게 해야 합니까? (0) | 2023.01.03 |
Python에서는 5(또는 다른 수)로 반올림 (0) | 2023.01.03 |