Java 为什么DispatcherServlet创建另一个应用程序上下文?

Java 为什么DispatcherServlet创建另一个应用程序上下文?,java,spring,spring-mvc,Java,Spring,Spring Mvc,我已经使用ContextLoaderListener和context init参数contextConfigLocation配置了根应用程序上下文 然后JSF(*.JSF)变量解析器访问根上下文。它很好用 现在的问题是,通过DispatcherServlet的请求(*.do)将获得另一个应用程序上下文,然后将单例bean实例化两次 对于DispatcherServlet,我不需要另一个应用程序上下文,如何指定它以重用由ContextLoaderListener加载的现有根应用程序上下文 注 在阅

我已经使用
ContextLoaderListener
和context init参数
contextConfigLocation
配置了根应用程序上下文

然后JSF(*.JSF)变量解析器访问根上下文。它很好用

现在的问题是,通过
DispatcherServlet
的请求(*.do)将获得另一个应用程序上下文,然后将单例bean实例化两次

对于
DispatcherServlet
,我不需要另一个应用程序上下文,如何指定它以重用由
ContextLoaderListener
加载的现有根应用程序上下文

在阅读了answers中的参考页之后,我知道在根上下文和调度程序上下文之间存在上下文分离,但是没有一个参考告诉我去哪里。下面是我的解决方案,可能对其他面临类似问题的人有所帮助:

  • 在dispatcher servlet的上下文配置XML中:
    dispatcher servlet.XML
    ,我复制了已在根上下文中定义的
    。所以把它拿走。
    dispatcherservlet.xml
    只需定义那些仅用于SpringMVC的bean

  • 所有控制器都已经在根上下文中被扫描和实例化,但是,SpringMVC默认情况下不会在根上下文中注册控制器以进行请求映射。您可以:

    2.1。在根上下文中,从
    中排除
    @Controller
    ,并仅在dispatcher-servlet.xml中扫描
    @Controller

    2.2。或者,将属性
    DefaultAnnotationHandlerMapping.DetectHandlersInancesTorContext
    设置为true:

    (dispatcher-servlet.xml:)
    
    <bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
        <property name="detectHandlersInAncestorContexts" value="true" />
    </bean>
    
    (dispatcher servlet.xml:)
    
  • 如果运行的是
    DispatcherServlet
    ,则无需使用
    ContextLoaderListener
    。只需使用
    ContextLoader.getCurrentWebApplicationContext()
    访问
    WebApplicationContext


    只需将bean定义分开。

    为了回答您的第一个问题,DispatcherServlet创建了一个上下文,因为它允许自己进行配置,如果您在一个应用程序中有多个DispatcherServlet,则每个DispatcherServlet都需要单独配置。因此,每个bean都有自己的上下文,这些上下文中的每一个都独立于“根”上下文,在“根”上下文中,所有真正的“工作”bean都应该存在,以便它们可以在其他上下文之间共享。在过去几周里,由于对这个问题的困惑,出现了许多问题。通过查看以下答案,您可能会更好地了解事物的工作原理:


    您好,下面的链接可能对您有用。[[1]:但是如果您没有使用ContextLoaderListener,则没有根上下文,ContextLoader.getCurrentWebApplicationContext()将返回null。因此,如果您的dispatcher上下文中有一个控制器,它如何从根上下文注入bean?我一直没有得到任何SuchBeanDefinitionException