【问题标题】:SpringMVC ApplicationContext HierarchySpringMVC 应用程序上下文层次结构
【发布时间】:2012-12-21 21:51:06
【问题描述】:

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>

根据this answer

2- DispatcherServlet 上下文成为根上下文的子级。 ...

我的问题是了解 Spring 如何做出此决定(将 DispatcherServlet 上下文附加到根上下文)。 appContext XML 文件中没有任何明确的内容来指定这一点,并且 AFAICT 没有任何内容可以在 XML 中指定来明确地建立这种关联。

当 DispatcherServlet 实例化其 appContext 时,它如何知道在其上调用 setParent()(SpringMVC 在没有根 appContext 的情况下也可以正常工作),如果已经存在多个非子 appContext,它将如何选择?

【问题讨论】:

    标签: spring spring-mvc hierarchy applicationcontext


    【解决方案1】:

    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;
    }
    

    简而言之:根上下文将对其自身的引用存储在上下文属性中。所有 FrameworkServlet 都将尝试检索所述上下文属性并将自己绑定到检索到的根上下文(如果已定义)。

    【讨论】:

    • 谢谢,这正是我所需要的。
    【解决方案2】:

    SpringMVC ApplicationContext Hierarchy -

    ApplicationContext(一)
    -ConfigurableApplicationContext(一)
    -WebApplicationContext(一)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-28
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 2011-03-12
      • 1970-01-01
      • 2016-06-18
      相关资源
      最近更新 更多