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
,我复制了已在根上下文中定义的
。所以把它拿走。dispatcherservlet.xml
只需定义那些仅用于SpringMVC的bean
中排除@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