복붙노트

[SPRING] 루트 컨텍스트와 디스패처 서블릿 컨텍스트가 Spring MVC 웹 애플리케이션과 정확히 얼마나 일치합니까?

SPRING

루트 컨텍스트와 디스패처 서블릿 컨텍스트가 Spring MVC 웹 애플리케이션과 정확히 얼마나 일치합니까?

Spring MVC를 공부 중이고 의심 스럽다.

그래서, 사용자 요청을 처리하는 DispatcherServlet을 구성하는이 구성 클래스가 있습니다.

public class MyWebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext container) {

        // Create the 'root' Spring application context
        AnnotationConfigWebApplicationContext rootContext = ...
        // Create the dispatcher servlet's Spring application context
        AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext();

       dispatcherContext.register(DispatcherConfig.class);

       // Register and map the dispatcher servlet
       ServletRegistration.Dynamic dispatcher = container.addServlet("main", new DispatcherServlet(dispatcherContext));
       dispatcher.setLoadOnStartup(1);
       dispatcher.addMapping("main/");
   }
}

DispatcherServlet이 어떻게 작동하는지는 분명합니다. 나의 의심은 컨텍스트 개념과 관련이 있습니다.

1) 정확하게 컨텍스트를 나타내는 것은 무엇입니까? 내 생각에 그것은 특정 목적을 가지고 환경으로 통하는 콩 세트와 같다고 생각합니다. 그러나 나는이 주장에 대해 절대 진실이 아닙니다.

2) 루트 컨텍스트와 디스패처 서블릿 컨텍스트의 차이점은 무엇입니까?

3) dispatcherContext에 정의 된 bean은 rootContext에 정의 된 bean에 액세스 할 수 있다는 것을 이해합니다. (반대는 사실이 아닙니다.) 왜?

Txx

해결법

  1. ==============================

    1.Spring 애플리케이션의 루트 컨텍스트는 ContextLoaderListener에 의해로드되는 ApplicationContext입니다. 이 컨텍스트에는 서비스, 리포지토리, 인프라 빈 (DataSource, EntityManagerFactorys 등)과 같은 전역 적으로 사용 가능한 리소스가 있어야합니다.

    Spring 애플리케이션의 루트 컨텍스트는 ContextLoaderListener에 의해로드되는 ApplicationContext입니다. 이 컨텍스트에는 서비스, 리포지토리, 인프라 빈 (DataSource, EntityManagerFactorys 등)과 같은 전역 적으로 사용 가능한 리소스가 있어야합니다.

    ContextLoaderListener는이 컨텍스트를 ServletContext에 org.springframework.web.context.WebApplicationContext.ROOT라는 이름으로 등록합니다.

    ApplicationContext를 직접로드하고 위의 이름으로 ServletContext에 등록하면 루트 컨텍스트로 적합합니다.

    Spring 애플리케이션의 자식 컨텍스트는 DispatcherServlet (또는 Spring-WS 애플리케이션의 MessageDispatcherServlet)에 의해로드되는 ApplicationContext이다. 이 컨텍스트는 ViewResolvers, HandlerMappings 등의 스프링 MVC를 위해 해당 컨텍스트와 관련된 빈만을 포함해야한다.

    서블릿은이 컨텍스트를 org.springframework.web.servlet.FrameworkServlet.CONTEXT. 이라는 이름으로 ServletContext에 등록합니다.

    자식 컨텍스트는 여러 컨텍스트를 가질 수 있으므로 부모 컨텍스트에만 액세스 할 수 있습니다. 예를 들어 Spring MVC와 Spring WS 애플리케이션을 결합한 경우. 부모 컨텍스트는 잘 알려진 이름을 가진 ServletContext에서 자식을 찾아 냄으로써 그것을 탐지한다.

    루트 컨텍스트가 빈을 연결하는 데 사용할 자식에 대한 액세스 권한을 갖고 있다면? 그 다음으로, AOP가 관련 될 때 놀라운 결과를 얻을 수도 있습니다. 자식 컨텍스트에 정의 된 AOP는 루트 컨텍스트에 구성된 Bean에 갑자기 영향을줍니다.

  2. from https://stackoverflow.com/questions/30639842/how-exactly-are-the-root-context-and-the-dispatcher-servlet-context-into-a-sprin by cc-by-sa and MIT license