2010-12-16 74 views
20

我已經在一個bean的「destroy-method」中放了一個sysout語句。當我運行一個示例代碼時,sysout沒有得到輸出。這是否意味着銷燬方法沒有被調用?什麼時候是一個叫做spring bean的destroy-method?

測試類:

package spring.test; 

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

    public class InitTest { 
    public static void main(String[] args) { 
     ApplicationContext ctx = new ClassPathXmlApplicationContext("InitTestContext.xml"); 
     InitTestBean bean = (InitTestBean)ctx.getBean("InitTestBean"); 
     bean.display(); 
    } 
    } 

package spring.test; 

    public class InitTestBean { 
    private String prop1; 
    private String prop2; 

    public InitTestBean(String prop1, String prop2) { 
     System.out.println("Instantiating InitTestBean"); 
     this.prop1 = prop1; 
     this.prop2 = prop2; 
    } 

    public void setProp1(String prop1) { 
     System.out.println("In setProp1"); 
     this.prop1 = prop1; 
    } 

    public void setProp2(String prop2) { 
     System.out.println("In setProp2"); 
     this.prop2 = prop2; 
    } 

    public String getProp1() { 
     return prop1; 
    } 

    public String getProp2() { 
     return prop2; 
    } 

    public void display() { 
     System.out.println("Prop1 is " + prop1); 
     System.out.println("Prop2 is " + prop2); 
    } 

    public void initialize(){ 
     System.out.println("In initialize"); 
     this.prop1 = "init-prop1"; 
     this.prop2 = "init-prop2"; 
    } 

    public void teardown() { 
     System.out.println("In teardown"); 
     this.prop1 = null; 
     this.prop2 = null; 
    } 
    } 

配置文件:

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

    <bean id="InitTestBean" class="spring.test.InitTestBean" init-method="initialize" destroy-method="teardown"> 
     <constructor-arg value="Prop1" /> 
     <constructor-arg value="Prop2" /> 
     <property name="prop1" value="setProp1"/> 
     <property name="prop2" value="setProp2"/> 
    </bean> 

</beans> 
+0

destroy-method工作得很好。向我們展示您的代碼和配置。 – skaffman 2010-12-16 11:44:25

+0

它應該像[this](http://www.java2s.com/Code/Java/Spring/DestroyMethod.htm) – 2010-12-16 12:00:40

+0

你沒有觸發器讓Spring知道你正在關閉。正如其他人指出的,你需要讓它知道,而不是整個關閉環境。 – asgs 2013-09-19 06:42:48

回答

27

您的例子不工作,因爲你沒有關閉appcontext ,你只是讓程序終止。

在上下文中調用close(),您將看到bean被調用的方法。

+1

ApplicationContext上沒有可用的close方法。 – 2010-12-16 12:23:53

+2

java_geek:它不在該接口上,它在實現上:'ClassPathXmlApplicationContext' – skaffman 2010-12-16 12:34:11

+0

即使是classpathxmlapplicationcontext也沒有close方法。 – 2010-12-20 14:56:40

21

這可能是太晚了OP,但如果有人仍然在尋找它...

close方法是AbstractApplicationContext而不是ApplicationContext,也是另一種方法是使用ctx.registerShutdownHook()instead of ctx.close()出於顯而易見的原因,在運行Junit時,您可能想要關閉上下文,但不能在生產環境中關閉,因此讓Spring決定何時關閉它。

+1

+1這應該是公認的答案。 – 2014-08-01 11:21:46

+1

+ 1.看看這個:http://www.tutorialspoint.com/spring/spring_bean_life_cycle.htm – 2014-12-09 07:55:08

+0

有沒有什麼辦法可以通過超時自動關閉它。假設我已將我的應用程序保留在服務器中閒置一週。它會在某個時候關閉嗎?在那段時間內銷燬方法會被調用嗎? – vsriram92 2017-01-30 18:40:35

5
//Getting application context 
ApplicationContext context = new ClassPathXmlApplicationContext(beansXML); 

//cleaning context 
((ClassPathXmlApplicationContext) context).close(); 
+0

這種方式可行。 – Gondy 2014-08-19 12:18:25

1

喜你需要改變ApplicationContextAbstractApplicationContext,然後註冊一個ShutDownhook這會破壞你的bean,也實現了DisposableBean接口,例如:

package spring.test; 

    import org.springframework.context.ApplicationContext; 
    import org.springframework.context.support.ClassPathXmlApplicationContext; 
    import org.springframework.context.support.AbstractApplicationContext; 
    public class InitTest { 
    public static void main(String[] args) { 
     AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("InitTestContext.xml"); 
    ctx.registerShutdownHook(); 
     InitTestBean bean = (InitTestBean)ctx.getBean("InitTestBean"); 
     bean.display(); 
    } 
    } 

現在implemnt DisposableBean接口也

package spring.test; 
import org.springframework.beans.factory.DisposableBean; 
    public class InitTestBean implements DisposableBean{ 
    private String prop1; 
    private String prop2; 
    public InitTestBean(String prop1, String prop2) { 
     System.out.println("Instantiating InitTestBean"); 
     this.prop1 = prop1; 
     this.prop2 = prop2; 
    } 
    public void setProp1(String prop1) { 
     System.out.println("In setProp1"); 
     this.prop1 = prop1; 
    } 
    public void setProp2(String prop2) { 
     System.out.println("In setProp2"); 
     this.prop2 = prop2; 
    } 
    public String getProp1() { 
     return prop1; 
    } 
    public String getProp2() { 
     return prop2; 
    } 
    public void display() { 
     System.out.println("Prop1 is " + prop1); 
     System.out.println("Prop2 is " + prop2); 
    } 
    public void initialize(){ 
     System.out.println("In initialize"); 
     this.prop1 = "init-prop1"; 
     this.prop2 = "init-prop2"; 
    } 
    public void teardown() { 
     System.out.println("In teardown"); 
     this.prop1 = null; 
     this.prop2 = null; 
    } 
    @Override 
    public void destroy() throws Exception { 

     System.out.println(" the bean has been destroyed"); 
    } 
    } 
1

factory.destroySingletons();之後bean.display() as destroy-method is v包含在bean的定義中。創建bean的默認範圍是singleton,因此調用factory.destroySingletons()將調用destroy-method中提到的方法。

+0

你能否添加更多的細節或解釋?你目前的答案非常稀少,很可能會被刪除。 – 2013-06-18 15:46:38

3

的「滅法」只叫當且僅當豆是單一實例

見IOC容器

信息的日誌輸出:銷燬單身在org.springframework。 [email protected]:定義beans [book1];工廠層級根

+0

這是我真正的答案。我一直在努力理解爲什麼'close'和'registerShutdownHook'不起作用。 – 2017-10-13 20:07:09