2011-09-09 8 views
0

私の豆の中でメソッドを破壊していますが、それは出力に表示されていません。ここで私を助けてください。以下Spring MVCでdestroy-methodがエラーを起こすのはなぜですか?

package com.vaannila; 

import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.AbstractApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class HelloWorldApp { 

    public static void main(String[] args) { 
     AbstractApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); 
     Ticket helloWorld = (Ticket) context.getBean("ticket"); 
     helloWorld.setTicketNo("ABC009"); 
     helloWorld.display(); 
     context.close(); 
    } 

} 

私のxmlファイルは

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 

<bean id="helloWorld" class="com.vaannila.HelloWorld"> 
    <property name="message" value="Hello World!"></property> 
</bean> 

<bean id="ticket" class="com.vaannila.Ticket" 
scope="prototype" init-method="init" destroy-method="destroy"/> 
</beans> 

と私が変更した場合はチケットクラスは

package com.vaannila; 

public class Ticket { 
private String ticketNo=""; 

public String getTicketNo() { 
    return ticketNo; 
} 

public void setTicketNo(String ticketNo) { 
    this.ticketNo = ticketNo; 
} 

public void display() 
{ 
System.out.println("Your Ticket No. is"+ ticketNo); 
} 

public void init() 
{ 
    System.out.println("Bean is ready You can use it now"); 
} 
public void destroy() 
{ 
    System.out.println("Bean is going to destroy"); 
} 
} 

の下にアウトプットを破壊する方法.. のためのinitメソッドのために与えていないがされていますinit-methodとdestroy-methodはデフォルトで以下のように "helloWorld"というBeanを破壊する際にエラーを出します

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" 
    default-init-method="init" default-destroy-method="destroy"> 

<bean id="helloWorld" class="com.vaannila.HelloWorld"> 
    <property name="message" value="Hello World!"></property> 
</bean> 

<bean id="ticket" class="com.vaannila.Ticket" 
scope="prototype"/> 



</beans> 
+0

ここで、BeanがBeanの定義にプロトタイプのプロパティを持っていれば、destroyメソッドは呼び出していないことに気付きました。しかし、なぜ誰も私に説明することができますか? –

答えて

0

Beanがプロトタイプとして定義されている場合、Beanコンテナは、そのBeanを要求されるたびに、このBeanコンテナの新しいインスタンスを作成します。プロトタイプスコープのBeanの背後にある考え方です。

作成後、コンテナはBeanの責任を放棄します。まだ参照を保持しているのか、最後の参照を削除したのかは分かりません。これは、コンテナが閉じられた後であっても当てはまります。 (コンテナはガベージコレクタではありません)。したがって、destroyメソッドを呼び出すタイミングはいつか分かりません。

チケットの初期化が必要な場合は、コードから直接このようなメソッドを呼び出す必要があります(シングルトンチケットを持っていないと仮定して)。

関連する問題