2013-10-08 71 views
0

我有一個多線程應用程序我想用Spring來寫,現在我用我的豆新線程範圍申報並通過相同的上下文到Runnable接口類。線程工作正常,我得到了每個線程的DAO /服務的新副本,這正是我想要的。克隆現有的ApplicationContext春

雖然我想我要在這種情況下,內存的問題,因爲這些線程可以無限期地產卵,而是制定新的ApplicationContext一個品牌ClassPathXmlApplicationContext的是緩慢的,有沒有一種方法,使上下文的深層副本所以它不需要從頭重新加載?

+3

我不太明白爲什麼你認爲你不能分享你的背景。 –

+0

我有一個線程輪詢並在「scheduleWithFixedDelay」中運行,該程序永遠不會停止,因此此上下文永遠不會關閉。這個線程派生工作線程來處理,在我傳入相同的上下文的時刻,但我擔心,因爲在這些線程運行後我沒有在上下文中調用.close(),它會吃掉所有的我的記憶。所以理想情況下,我會創建一個新的上下文,獲取我的Runnable bean,運行它,然後關閉上下文。我正在做的,但每次創建緩慢的上下文,希望有一種方法克隆它。 –

回答

2

而不是使用線程作用域bean,請使用singleton scope beans。這是默認行爲,所以你不必做任何特別的事 - 即不指定範圍。如果您已經添加了自定義線程作用域,那麼只需刪除該配置的那部分。

在應用程序關閉之前,不應該關閉包含單例作用域bean的上下文。 Here是如何做一個乾淨的關機。

克隆ApplicationContext的整個理想是朝着錯誤方向邁出的一步。你真的應該只考慮Spring管理的bean的生命週期。換句話說,通常你的應用程序不應該知道或關心ApplicationContext,而應該僅僅依靠Spring IoC正常工作。因此,您的原始問題從「如何創建新的ApplicationContext?」更改到「我如何獲得對正確的Spring管理的bean的引用」?此外,如果您克隆ApplicationContext,那麼您可能會違反Spring的IoC容器的合同(例如,創建應該是單例的數據庫連接池的多個實例),並且其他人將無法弄清楚發生了什麼!

+0

好點,投票+,在我的情況下,我創建一個新的上下文,所以singleton工作正常,我只需要更早的線程範圍,因爲我重用了單個上下文。但是這仍然存在問題,克隆現有上下文有沒有更快的方法,而不是通過新的ClassPathXmlApplicationContext重新初始化它? –

+0

我更新瞭解決此問題的回覆。基本上你不應該試圖做到這一點,我試圖激發原因。 – jtoberon

+0

嗯,謝謝,我沒有使用一個讓我困惑的連接池,我試圖擺脫維護一個單獨的連接,所以我有新線程初始化他們自己的新上下文/連接。單身連接池和Spring JDBC支持將解決我的問題,謝謝。 –