簡體   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