编辑:
这个问题与When does destroy method is called不同,因为我正在调用context.registerShutdownHook
并且正如您从日志中看到的那样,我的bean正在变得岌岌可危。我的问题是春天不是在调用我的方法。在问这里之前我已经检查了这个问题。
我正在使用spring框架在我的应用程序中配置graceful destroy。当我运行程序时,它不会调用bean.xml中指定的destory方法。请帮帮我,我做错了什么。
这里是SSCCE
Bean.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.hello.pojo.HelloWorld"
scope="prototype" init-method="init" destroy-method="destroy">
</bean>
</beans>
HelloWord.java
package com.hello.pojo;
public class HelloWorld {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public void init(){
System.out.println("Bean initializating is in progress");
}
public void printMessage(){
System.out.println("Your message: "+getMessage());
}
public void destroy(){
System.out.println("Bean is being destroyed");
}
}
MainApp.java
package com.main;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.hello.pojo.HelloWorld;
public class MainApp {
public static void main(String[]args){
AbstractApplicationContext context = new ClassPathXmlApplicationContext("Bean.xml");
HelloWorld objA = (HelloWorld) context.getBean("helloworld");
objA.setMessage("I am Object A");
objA.printMessage();
context.registerShutdownHook();
}
}
输出
May 27, 2013 11:59:14 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@e9028874: startup date [Mon May 27 23:59:14 EDT 2013]; root of context hierarchy
May 27, 2013 11:59:14 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [Bean.xml]
Bean initializating is in progress
Your message: I am Object A
May 27, 2013 11:59:14 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@63390b47: defining beans [helloworld]; root of factory hierarchy
May 27, 2013 11:59:14 PM org.springframework.context.support.ClassPathXmlApplicationContext doClose
INFO: Closing org.springframework.context.support.ClassPathXmlApplicationContext@e9028874: startup date [Mon May 27 23:59:14 EDT 2013]; root of context hierarchy
May 27, 2013 11:59:14 PM org.springframework.beans.factory.support.DefaultListableBeanFactory destroySingletons
INFO: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@63390b47: defining beans [helloworld]; root of factory hierarchy
修订:
我已尝试close
和registerShutdownHook()
来关闭上下文,但没有一个可以正常工作。
答案 0 :(得分:41)
不为范围原型的bean调用Destroy方法。这是因为上下文没有跟踪原型范围对象(如果是这样,它将导致内存泄漏,因为spring不知道何时处置它)。
春季文档中的详细信息。
Spring reference documentation
在部署时需要注意一件非常重要的事情 bean在原型范围内,因为bean的生命周期发生了变化 略。 Spring不管理原型的整个生命周期 bean:容器实例化,配置,装饰等 组装原型对象,将其交给客户端,然后没有 进一步了解该原型实例。这意味着,虽然 初始化生命周期回调方法将被调用 对象无论范围如何,在原型的情况下,任何配置 不会调用销毁生命周期回调。