Иерархия контекста приложения SpringMVC

Фрагмент web.xml:

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext-security.xml</param-value>
  </context-param>

  <!-- Processes application requests -->
  <servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

Согласно этому ответу:

2- Контекст DispatcherServlet становится дочерним элементом корневого контекста. ...

Мой вопрос состоит в том, чтобы понять, как Spring принимает это решение (присоединить контекст DispatcherServlet к корневому контексту). Ни в одном XML-файле appContext нет ничего явного, чтобы указать это, и AFAICT нет ничего, что вы могли бы указать в XML, чтобы сделать эту ассоциацию явно.

Когда DispatcherServlet создает экземпляр своего appContext, как он узнает, что для него нужно вызвать setParent() (SpringMVC прекрасно работает без корневого appContext), и если уже существует более одного не дочернего appContext, как бы он выбрал?


person Jim Garrison    schedule 08.01.2013    source источник


Ответы (2)


DispatcherServlet расширяет FrameworkServlet, который имеет следующий код:

    protected WebApplicationContext initWebApplicationContext() {
        WebApplicationContext rootContext =
                WebApplicationContextUtils.getWebApplicationContext(getServletContext());
            WebApplicationContext wac = null;

который впоследствии используется как:

 wac = createWebApplicationContext(rootContext);

WebApplicationContextUtils извлекает контекст как:

public static WebApplicationContext getWebApplicationContext(ServletContext sc) {
    return getWebApplicationContext(sc, WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
}

public static WebApplicationContext getWebApplicationContext(ServletContext sc, String attrName) {
    Assert.notNull(sc, "ServletContext must not be null");
    Object attr = sc.getAttribute(attrName);
            ...
    return (WebApplicationContext) attr;
}

В двух словах: корневой контекст хранит ссылку на себя в атрибуте контекста. Все FrameworkServlets будут пытаться получить указанный атрибут контекста и привязать себя к полученному корневому контексту (если он определен).

person rootkit    schedule 01.02.2013
comment
Спасибо, это именно то, что мне было нужно. - person Jim Garrison; 02.02.2013

Иерархия контекста приложения SpringMVC —

ApplicationContext (I)
-ConfigurableApplicationContext (I)
-WebApplicationContext (I)

person Deepak Gupta    schedule 09.11.2014