2013-10-25 13 views
0

我在Web應用程序中有一個Web應用程序上下文(用於DISPATCHER)和Web服務上下文(用於MESSAGE DISPATCHER)。 我有一個單身的bean,我需要這兩個上下文的bean。 如果我在兩個上下文中將bean指定爲單例,那麼它不再是單例。 請提出解決方案或指導我正確的方向。在兩種情況下的單身bean spring

<servlet> 
    <servlet-name>ws</servlet-name> 
    <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>   
    <init-param> 
     <param-name>transformWsdlLocations</param-name> 
     <param-value>true</param-value> 
    </init-param>  
</servlet> 

<servlet-mapping> 
    <servlet-name>ws</servlet-name> 
    <url-pattern>/service/*</url-pattern> 
</servlet-mapping> 

<servlet> 
    <servlet-name>mvc</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>   
</servlet> 

<servlet-mapping> 
    <servlet-name>mvc</servlet-name> 
    <url-pattern>*.htm</url-pattern> 
</servlet-mapping> 

<servlet-mapping> 
    <servlet-name>mvc</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 
+1

你是如何創建兩個上下文的? – beny23

+0

請參閱下面的添加評論。 – Venkat

+0

查看web.xml的相關部分和每個applicationContext.xml文件 – trf

回答

2

如果我正確理解您的問題,您有Web應用程序上下文(例如*-servlet.xml)和根應用程序上下文(例如applicationContext.xml)。 Web應用程序上下文擴展應用程序上下文,以便它可以從父訪問bean,而不是周圍的其他方式,所以它必須同時在被訪問豆類應在applicationContext.xml

參見:

編輯:

在你的web.xml中有兩個ServletContext,但沒有根上下文。這個問題的答案What is the difference between ApplicationContext and WebApplicationContext in Spring MVC?有這個極好的解釋,但總之,你需要通過添加以下到web.xml中加載根應用上下文:

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath*:META-INF/spring/applicationContext*.xml</param-value> 
</context-param> 

<listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

這將然後加載從的applicationContext根應用程序上下文。 XML。兩個ServletContext中都可以訪問根應用程序上下文中的Bean。您通常只需要在您的ServletContexts中使用與Web相關的Bean(控制器等),並在根應用程序上下文中共享業務邏輯。

+0

一個是web應用上下文(spring mvc)另一個是webservices applicationcontext(org.springframework.ws.transport.http。MessageDispatcherServlet),它使用spring創建webservices。但讓我試試你的建議謝謝 – Venkat

+1

謝謝trf。像魅力一樣工作。 – Venkat

0

如果bean需要在兩個不同的上下文中使用,在一個單獨的應用程序上下文XML文件定義它,然後創建三個應用程序上下文:

根上下文 - 包含共享的bean(多個)

應用上下文1.例如web應用程序。將根上下文作爲父項。 應用上下文2.例如Web服務接口,也具有作爲父級的根上下文。

當根應用程序上下文創建時,bean將被實例化一次。這兩個子應用程序上下文都可以使用該單例bean。

+0

Hedley,請您建議如何加載這第三個上下文。目前我正在用wex.xml中指定的相應servletname-context.xml文件加載兩個上下文。我對進口感到困惑。導入將消除冗餘指定在這兩個xml文件中的相同的bean吧?而不是兩種情況下的單一實例? – Venkat

+0

是的,對不起,我不應該使用「導入」一詞。我已經調整了答案,所以它沒有那麼混亂,但現在看來,trf已經給出了一個很好的解釋。 – Hedley