Destroy方法在spring框架中不起作用

ash*_*ish 12 java spring

编辑:这个问题和什么时候调用destroy方法是不一样的,因为我正在调用,context.registerShutdownHook而且我的bean正在从日志中看到它们.我的问题是春天不是在调用我的方法.在问这里之前我已经检查了这个问题.

我正在使用spring框架在我的应用程序中配置优雅的销毁.当我运行程序时,它不会调用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>
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)

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();
    }

}
Run Code Online (Sandbox Code Playgroud)

产量

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
Run Code Online (Sandbox Code Playgroud)

修正案:我已经尝试closeregisterShutdownHook()关闭了背景,但没有一个有效.

gka*_*mal 46

对于范围原型的bean,不调用Destroy方法.这是因为上下文不跟踪原型范围对象(如果是这样,它将导致内存泄漏,因为spring不知道何时处置它).

弹簧文档中的详细信息.

Spring参考文档

在原型范围中部署bean时需要注意一件非常重要的事情,因为bean的生命周期会略有变化.Spring不管理原型bean的完整生命周期:容器实例化,配置,装饰和组装原型对象,将其交给客户端,然后不再了解该原型实例.这意味着虽然无论范围如何都将在所有对象上调用初始化生命周期回调方法,但在原型的情况下,将不会调用任何已配置的销毁生命周期回调.