繁体   English   中英

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

[英]Why DispatcherServlet creates another application context?

我已使用ContextLoaderListener和上下文init-parameter contextConfigLocation配置了根应用程序上下文。

然后由JSF(* .jsf)变量解析器访问根上下文。 它工作正常。

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

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

注意

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

  1. 在调度程序servlet: dispatcher-servlet.xml的上下文配置XML中,我有重复定义的<context:component-scan/> ,它已在根上下文中定义。 所以删除它。 dispatcher-servlet.xml只需要定义那些仅用于Spring MVC的bean。

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

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

    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应该存在,以便它们可以在其他上下文之间共享。 过去几周出现了一些问题,这些问题是由于对这个问题的混淆而产生的。 通过查看答案,您可以更好地了解事情的工作原理:

Spring XML文件配置层次结构帮助/解释

在父上下文和子上下文中声明Spring Bean

Spring-MVC:什么是“上下文”和“命名空间”?

如果运行DispatcherServlet ,则无需使用ContextLoaderListener 只需使用ContextLoader.getCurrentWebApplicationContext()来访问WebApplicationContext

只需按照上一个答案中的说明将bean定义分开。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM