[java] 為什麼DispatcherServlet會創建另一個應用程序上下文?


Answers

如果運行DispatcherServlet ,則無需使用ContextLoaderListener 只需使用ContextLoader.getCurrentWebApplicationContext()來訪問WebApplicationContext

只需將bean定義分開,如前面的答案中所述

Question

我已使用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>
    



Links