루트 및 하위 컨텍스트 추가 정보를 읽기 전에 다음 사항을 이해하십시오.
Spring은 한 번에 여러 컨텍스트를 가질 수 있습니다. 그중 하나는 루트 컨텍스트이고 다른 모든 컨텍스트는 하위 컨텍스트입니다.
모든 하위 컨텍스트는 루트 컨텍스트에 정의 된 Bean에 액세스 할 수 있습니다. 그러나 반대는 사실이 아닙니다. 루트 컨텍스트는 하위 컨텍스트 Bean에 액세스 할 수 없습니다.
ApplicationContext :
applicationContext.xml은 모든 웹 응용 프로그램의 루트 컨텍스트 구성입니다. Spring은 applicationContext.xml 파일을로드하고 전체 애플리케이션에 대한 ApplicationContext를 생성한다. 웹 애플리케이션 당 하나의 애플리케이션 컨텍스트 만 있습니다. contextConfigLocation 매개 변수를 사용하여 web.xml에서 컨텍스트 구성 파일 이름을 명시 적으로 선언하지 않으면 Spring은 WEB-INF 폴더에서 applicationContext.xml을 검색하고이 파일을 찾을 수 없으면 FileNotFoundException을 발생시킵니다.
ContextLoaderListener 루트 응용 프로그램 컨텍스트에 대한 실제 초기화 작업을 수행합니다. "contextConfigLocation"컨텍스트 매개 변수를 읽고 값을 컨텍스트 인스턴스에 전달하여 값을 여러 개의 파일 경로로 구문 분석하여 여러 개의 쉼표와 공백으로 구분할 수있는 여러 파일 경로로 구문 분석합니다 (예 : "WEB-INF / applicationContext1.xml, WEB-INF / applicationContext2.xml”을 참조하십시오. ContextLoaderListener는 선택 사항입니다. 여기서 요점을 밝히기 위해 : DispatcherServlet을 사용하는 기본 최소 web.xml 인 ContextLoaderListener를 구성하지 않고도 Spring 응용 프로그램을 부팅 할 수 있습니다.
DispatcherServlet DispatcherServlet은 기본적으로 구성된 URL 패턴과 일치하는 수신 웹 요청을 처리하는 데 사용되는 서블릿 (HttpServlet을 확장)입니다. 들어오는 URI를 가져와 컨트롤러와 뷰의 올바른 조합을 찾습니다. 전면 컨트롤러입니다.
스프링 구성에서 DispatcherServlet을 정의 할 때 contextConfigLocation 속성을 사용하여 컨트롤러 클래스, 뷰 맵핑 등의 항목이있는 XML 파일을 제공합니다.
WebApplicationContext ApplicationContext 외에도 단일 웹 응용 프로그램에 여러 WebApplicationContext가있을 수 있습니다. 간단히 말해, 각 DispatcherServlet은 단일 WebApplicationContext와 연관되어 있습니다. xxx-servlet.xml 파일은 DispatcherServlet에 고유하며 웹 애플리케이션은 요청을 처리하도록 구성된 둘 이상의 DispatcherServlet을 가질 수 있습니다. 이러한 시나리오에서 각 DispatcherServlet에는 별도의 xxx-servlet.xml이 구성되어 있습니다. 그러나 applicationContext.xml은 모든 서블릿 구성 파일에 공통입니다. Spring은 기본적으로 webapps WEB-INF 폴더에서“xxx-servlet.xml”이라는 파일을로드합니다. 여기서 xxx는 web.xml의 서블릿 이름입니다. 해당 파일 이름의 이름을 변경하거나 위치를 변경하려면 contextConfigLocation을 사용하여 initi-param을 param 이름으로 추가하십시오.
그들 사이의 비교와 관계 :
ContextLoaderListener 및 DispatcherServlet
ContextLoaderListener는 루트 애플리케이션 컨텍스트를 작성합니다. DispatcherServlet 항목은 서블릿 항목 당 하나의 하위 애플리케이션 컨텍스트를 작성합니다. 자식 컨텍스트는 루트 컨텍스트에 정의 된 Bean에 액세스 할 수 있습니다. 루트 컨텍스트의 Bean은 하위 컨텍스트의 Bean에 직접 액세스 할 수 없습니다. 모든 컨텍스트가 ServletContext에 추가됩니다. WebApplicationContextUtils 클래스를 사용하여 루트 컨텍스트에 액세스 할 수 있습니다.
Spring 문서를 읽은 후 다음을 이해합니다.
a) 응용 문맥은 계층 적이며 WebApplicationContext도 마찬가지입니다. 여기에서 설명서를 참조하십시오.
b) ContextLoaderListener는 웹 애플리케이션에 대한 루트 웹 애플리케이션 컨텍스트를 작성하고이를 ServletContext에 넣습니다. 이 컨텍스트는 컨트롤러 계층 (Struts 또는 Spring MVC)에서 어떤 기술이 사용되고 있는지에 관계없이 스프링 관리 Bean을로드 및 언로드하는 데 사용할 수 있습니다.
c) DispatcherServlet은 자체 WebApplicationContext를 작성하고 핸들러 / 컨트롤러 / 뷰 리졸버는이 컨텍스트에 의해 관리됩니다.
d) ContextLoaderListener가 DispatcherServlet과 함께 사용되는 경우, 루트 웹 애플리케이션 컨텍스트가 앞서 언급 된대로 먼저 작성되고 하위 컨텍스트도 DispatcherSerlvet에 의해 작성되며 루트 애플리케이션 컨텍스트에 첨부됩니다. 여기에서 설명서를 참조하십시오.
Spring MVC와 함께 작업하고 서비스 계층에서 Spring을 사용하는 경우 두 가지 애플리케이션 컨텍스트를 제공합니다. 첫 번째는 ContextLoaderListener를 사용하여 구성하고 다른 하나는 DispatcherServlet을 사용하여 구성합니다.
일반적으로 DispatcherServlet 컨텍스트에서 모든 MVC 관련 Bean (컨트롤러 및보기 등)과 ContextLoaderListener에 의해 루트 컨텍스트에서 보안, 트랜잭션, 서비스 등과 같은 모든 교차 절단 Bean을 정의합니다.
자세한 내용은 https://siddharthnawani.blogspot.com/2019/10/contextloaderlistener-vs.html 을 참조하십시오.