Как именно корневой контекст и контекст сервлета диспетчера в веб-приложение 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 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) Что именно представляет контекст? Я думаю, что это что-то вроде набора beans, который имеет конкретную заливку и работает в среде. Но я абсолютно не верю в это утверждение.

2) В чем разница между корневым контекстом и контекстом сервлета диспетчера?

3) Из того, что я понял, beans, определенный в dispatcherContext, имеет доступ к beans, определенному в rootContext (но противоположное неверно). Почему?

Тпх

Ответы

Ответ 1

Корневой контекст

Корневым контекстом в приложении Spring является ApplicationContext, который загружается ContextLoaderListener. Этот контекст должен иметь глобально доступные ресурсы, такие как службы, репозитории, инфраструктура beans (DataSource, EntityManagerFactory и т.д.) И т.д.

ContextLoaderListener регистрирует этот контекст в ServletContext под именем org.springframework.web.context.WebApplicationContext.ROOT.

Если вы загрузите ApplicationContext самостоятельно и зарегистрируйте его с именем, указанным выше в ServletContext, которое затем будет квалифицироваться как корневой контекст.

Контекст для детей

Детский контекст в приложении Spring - это ApplicationContext, который загружается DispatcherServlet (или, например, a MessageDispatcherServlet в приложение Spring -WS). Этот контекст должен содержать только beans, относящийся к этому контексту, для Spring MVC, который будет ViewResolver s, HandlerMapping и т.д.

Сервлет регистрирует этот контекст в ServletContext под именем org.springframework.web.servlet.FrameworkServlet.CONTEXT.<servlet-name>.

Отношение корня < -Child

Только дочерние контексты имеют доступ к родительскому контексту, потому что у вас может быть несколько дочерних контекстов. Например, в Spring MVC в сочетании с приложением Spring WS. Родительский контекст обнаруживает дочерние элементы, находя его в ServletContext с известным именем.

Если корневой контекст будет иметь доступ к ребенку, который он использовал бы для проводки beans? Рядом с этим, если это будет так, вы также получите неожиданные результаты при участии АОП. AOP, определенный в дочернем контексте, внезапно повлияет на beans, настроенный в корневом контексте.