2012-03-22 7 views
0

私はClassPathXMLApplicationContextを持っているアプリケーションを持っています。このアプリケーションは、spring xmlファイルからいくつかの豆をロードしています。 実行時にBeanを追加したい。だから私はClassPathXMLApplicationContextの別のインスタンスを作成し、新しいxmlファイルから新しいbean定義を読み込みます。今私は2つのappContextを持っています。実行時Beanのデプロイメントを行い、Spring iocコンテナーでBeanを破壊する方法は?

質問:新しいコンテキストから古いコンテキストにBeanをコピーするにはどうすればよいですか?コピーする必要がありますか?私はちょうどこれらの2つのコンテキストをマージできませんか?マージのためのAPIはありますか?

後で実行時にBeanをアンデプロイします。また、Beanを削除するときにクラスローダーがBeanクラスをアンロードするようにしたい。

BeanをApplicationContextから削除し、Beanクラスをアンロードする方法。

おかげで、 よろしく、 ビマル

+1

Beanをコンテキストに追加するときに期待されるSpringの動作は次のとおりです。完全な依存性を再計算するか、トランザクションのサポート、aopなどの追加機能が必要なのでしょうか? – Ralph

+0

@Ralph私は依存関係を再計算する必要はありません。新しいBeanだけがコンテナ内で使用可能になるはずです。他の人が使用できるようにします。削除についての質問は – weima

答えて

0

あなたはClassPathXMLAplicationContextの2番目のインスタンスを必要としません。

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"); 

あなたは「Bateryは、」あなたが欲しいものを初期化しますが、「CD-RW」可能性が2つのBeanは、コンストラクタで初期化することはできません必要なXMLファイルでは:私は、これはあなたを助けると思います。ここではセッターとの例では、初期化している:

<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 =ヌル

を行うことができます
+0

、私はあなたの例を使用します。私が "aaa" beanをロードしたとします。後で "com.trader.springtest1.Battery"クラスの新しいバージョンがあり、JVMを再起動せずにアプリケーションが新しいバージョンを使用するようにします。だから、 "aaa"という名前のBeanを削除してから、新しいクラスでそれをリロードします。そのため、新しいBatteryクラスをロードするには、古いBatteryクラスをクラスローダーでアンロードする必要があります。それ以外の場合は 'getBean(" aaa ")' – weima

+0

を実行すると古いクラスのオブジェクトが返されます。 'myProduc = null'を実行すると、' ClassPathXmlApplicationContext '内のrefereceもnullになりますか?私はそうは思わない。私のBeanはシングルトンBeanであるため、SpringはXMLBeanFactory内にマップを保持します。その参照はまだ存在します。 – weima

+0

ちょうど使用 myProduct = null; myProduct = context.getBean( "Batery"); nullは、myProductの保持カウントを0にしてから、再び保持します。 –

関連する問題