![](/img/trans.png)
[英]How to enable Spring application context in servlets not managed by DispatcherServlet?
[英]Why DispatcherServlet creates another application context?
我已使用ContextLoaderListener
和上下文init-parameter contextConfigLocation
配置了根應用程序上下文。
然后由JSF(* .jsf)變量解析器訪問根上下文。 它工作正常。
現在的問題是,通過DispatcherServlet
的請求(* .do)將獲得另一個應用程序上下文,然后單例bean被實例化兩次。
我不需要DispatcherServlet
另一個應用程序上下文,我如何指定它來重用現有的根應用程序上下文,它由ContextLoaderListener
加載?
注意
在閱讀了答案中的參考頁面后,我知道根上下文和調度程序上下文之間存在上下文分離,但沒有一個引用告訴我去哪里。 所以這是我的解決方案,可能對面臨類似問題的其他人有幫助:
在調度程序servlet: dispatcher-servlet.xml
的上下文配置XML中,我有重復定義的<context:component-scan/>
,它已在根上下文中定義。 所以刪除它。 dispatcher-servlet.xml
只需要定義那些僅用於Spring MVC的bean。
所有控制器都已在根上下文中進行掃描和實例化,但是,默認情況下,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應該存在,以便它們可以在其他上下文之間共享。 過去幾周出現了一些問題,這些問題是由於對這個問題的混淆而產生的。 通過查看答案,您可以更好地了解事情的工作原理:
如果運行 DispatcherServlet
,則無需使用ContextLoaderListener
。只需使用 ContextLoader.getCurrentWebApplicationContext()
來訪問WebApplicationContext
。
只需按照上一個答案中的說明將bean定義分開。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.