2012-03-26 113 views
1

我有一個具體的要求,我應該動態地(在運行時)能夠加載和卸載我的Spring IoC容器中的bean類。如何使用類加載器實例化spring bean?

一個bean必須

  1. 創建
  2. 破壞
  3. 重新創建(同一類,同一類的可能的新版本)

我是問題面對的是,因爲第1步中的類被加載到系統類加載器中,所以即使在我銷燬bean時它仍然存在。所以在第三步中,我得到了舊班級的一個對象,而不是新班級。

所以我的問題的解決方案是加載類MyClassLoader而不是系統類加載器。

所以我的步驟變得

  1. 創建特定的類加載器
  2. 使用特定的類加載器
  3. 設置bean的引用爲null,從AppContext
  4. 設置的類加載器的參考,除去豆創建bean null

使用步驟1和2重新加載bean

我的問題是如何在Spring IoC容器中實現上述方法?

感謝,

問候,

VIMAL

+1

你可以用新的類加載器重新創建spring上下文嗎?請記住,重新創建bean不會將它重新注入到現有的bean中,而只要它被引用。還記得父類加載器總是優先於後代。 – mrembisz 2012-03-26 09:20:54

+0

@mrembisz嗨,似乎是一個好主意,在新的類加載器中創建AppContext本身。我會試一試。但是在新的類加載器中創建一個AppContext將確保這個上下文中的所有bean也被加載到同一個類加載器中? – weima 2012-03-26 09:24:18

+0

你應該調用context.setClassLoader(classLoader)來確保。你也想重載的類在classLoader的父類中不可用。 – mrembisz 2012-03-26 10:25:55

回答

3

您可以將一些對象移動到將用專用類加載器重新加載的上下文。爲了確保使用正確的類加載器,請在調用刷新之前調用context.setClassLoader(classLoader)或通過Thread.currentThread().setContextClassLoader(classLoader)設置線程類加載器。另外請記住,如果要重新加載的類可用於某個公用父類加載器,則它們將不會被重新加載,因爲父類加載器始終優先。

1

JRebel或許是一個解決辦法?

+0

JRebel是一款開發工具。我想,Vimal想在應用程序中完成這項工作。 – vacuum 2012-03-26 11:12:33

+0

@vacuum - 呃,不,不是。這是一個JVM插件。有些人可能只用它進行開發,但JRebel/LiveRebel可以實現熱代碼重新部署,並且零停機時間部署是一項特色產品。 – pap 2012-03-26 14:05:16

相關問題