2012-03-22 44 views
0

我有一個應用程序,它有一個ClassPathXMLApplicationContext它已經從spring xml文件加載了一些bean。 我想在運行時添加一個bean。所以我創建了另一個ClassPathXMLApplicationContext實例,它從新的xml文件中讀取新的bean定義。現在我有兩個appContexts。如何在Spring ioc容器中執行運行時bean部署並銷燬一個bean?

我的問題是:我如何將bean從新的上下文複製到舊的上下文?是否需要複製?我不能合併這兩個上下文嗎?有合併的API嗎?

後來我想取消部署bean的運行時。我也希望classloader在我刪除bean時卸載這個bean類。

如何從ApplicationContext中刪除一個bean並卸載這個bean類。

感謝, 問候, VIMAL

+1

將bean添加到上下文時,Spring的預期行爲是什麼:Spring應該重新計算完整的依賴項,還是隻需要額外的功能,比如事務支持,aop,...以及添加/刪除的bean? – Ralph 2012-03-22 06:58:21

+0

@Ralph我不需要重新計算依賴關係。只是新的bean應該在容器中可用。以便其他人可以使用它。 – weima 2012-03-22 07:52:46

回答

0

你不需要ClassPathXMLAplicationContext的第二個實例。我認爲這將有助於你:

ApplicationContext context = new ClassPathXmlApplicationContext("Spring-Module.xml"); 
Product myProduct = (Product) context.getBean("Batery"); 
//when you want to change the bean with another 
myProduct = (Product) context.getBean("CD-RW"); 

在XML文件中,你需要兩個豆其中「Batery」可以用你想要的初始化,但「CD-RW」不能與構造函數初始化。下面是二傳手初始化一個例子:

<bean id="Batery" class="com.seller.springtest1.Battery"> 
    <property name="name" value="AAA" /> 
    <property name="price" value="2.5" /> 
</bean> 

<bean id="CD-RW" class="com.seller.springtest1.Disc"> 
    <property name="name" value="CD-RW" /> 
    <property name="price" value="1.5" /> 
</bean> 

我沒有得到有關缺失aquestion(它的垃圾回收功能),如果你有特殊需要(當你保留了myProduct的參考),你可以做myProduct的= NULL

+0

對於刪除問題,我會用你的例子。假設我已經加載了「aaa」bean。後來,我有了「com.trader.springtest1.Battery」類的新版本,我希望應用程序在不重新啓動JVM的情況下使用新版本。所以我想刪除名爲「aaa」的bean,然後用新類重新加載它。所以爲了獲得新的電池類別,舊的電池類必須由類加載器卸載。否則它會給老類的對象,如果我'getBean(「aaa」)' – weima 2012-03-22 07:48:32

+0

如果我'myProduc = null'它是否也將'ClassPathXmlApplicationContext'內的引用設置爲null?我想不是。因爲我的bean是單身bean,Spring在XMLBeanFactory中維護一個映射。該參考依然存在。 – weima 2012-03-22 07:55:07

+0

只需使用 myProduct = null; myProduct = context.getBean(「Batery」); null將釋放myProduct的保留計數爲0,然後再保留它。 – 2012-03-22 08:09:48

相關問題