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

标签 java spring spring-mvc

我已经使用 ContextLoaderListener 配置了根应用程序上下文和上下文初始化参数 contextConfigLocation .

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

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

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

注意

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

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

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

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

    2.2。或者,设置属性 DefaultAnnotationHandlerMapping.detectHandlersInAncestorContexts为真:

    (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 file configuration hierarchy help/explanation

Declaring Spring Bean in Parent Context vs Child Context

Spring-MVC: What are a "context" and "namespace"?

关于java - 为什么 DispatcherServlet 创建另一个应用程序上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7833767/

相关文章:

ajax - Spring MVC 无法返回 JSONArray 对象错误 406

java - SWT:将键码转换为字符串

java - 我的 Android 应用程序的多任务处理速度缓慢

java - 如何打印不重复的字符串?

java - 作用域 bean : inject one into another

java - Spring Boot 部署看不到 .class 文件

java - 短文件名导致两个其他相同路径出现问题

java - 如何在Spring boot中模拟本地RestTemplate来解决连接被拒绝的问题?

java-Spring MVC : Redirect requests with old URLs to new URLs

java - Spring MVC 配置 url-pattern