为什么DispatcherServlet创建另一个应用程序上下文?
我已经使用ContextLoaderListener
和上下文init-parameter
配置了根应用程序上下文contextConfigLocation
。
然后,JSF(* .jsf)变量解析器访问根上下文。工作正常。
现在的问题是,经过的请求(* .do)DispatcherServlet
将获得另一个应用程序上下文,然后单例bean实例化两次。
我不需要其他的应用程序上下文DispatcherServlet
,如何指定它以重新使用由加载的现有根应用程序上下文ContextLoaderListener
?
注意
阅读答案中的参考页后,我知道根上下文和调度程序上下文之间存在上下文分隔,但是没有一个参考告诉我要去哪里。因此,这是我的解决方案,可能对面临类似问题的其他人有所帮助:
在调度程序servlet:的上下文配置XML中
dispatcher-servlet.xml
,我重复了<context:component-scan/>
已在根上下文中定义的define定义。因此将其删除。该dispatcher-servlet.xml
只需要定义仅用于Spring MVC的那些豆子。在根上下文中已经扫描并实例化了所有控制器,但是,默认情况下,Spring MVC不会在根上下文中注册控制器以进行请求映射。您可以:
2.1。在根上下文中,@Controller
从中排除<component-scan>
,并且@Controller
仅在dispatcher-
servlet.xml中进行扫描。
2.2。或者,将该属性设置DefaultAnnotationHandlerMapping.detectHandlersInAncestorContexts
为true:
(dispatcher-servlet.xml:)<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="detectHandlersInAncestorContexts" value="true" />
</bean>
回答:
为了回答您的第一个问题,DispatcherServlet创建了一个上下文,因为这是它允许自己进行配置的方式,并且如果您在一个应用程序中有多个DispatcherServlet,则需要分别对其进行配置。因此,每个都有自己的上下文,并且每个上下文都与“根”上下文分离,在该根上下文中,所有真实的“工作”
bean都应存在,以便可以在其他上下文之间共享。在过去的几周中,由于这个问题的混乱而产生了许多问题。
以上是 为什么DispatcherServlet创建另一个应用程序上下文? 的全部内容, 来源链接: utcz.com/qa/405828.html