如何在终止之前为容器中的每个bean调用destroy-method

时间:2013-07-05 22:02:09

标签: java spring

我目前正在学习并试验Spring的配置中指定的Spring的init-method和destroy-method属性。

我的问题是如何告诉Spring在程序终止之前为那些设置了方法的bean调用destroy-method?

换句话说,我希望对程序存在于执行之前使用destroy-method归属的所有bean进行任何拆卸操作。这甚至可能吗?

正如其他许多人所说,我正在阅读Manning的书“Spring in Action”,因此我现在正在尝试使用这个bean:

 <bean id="auditorium" class="com.springinaction.springidol.Auditorium"
 init-method="turnOnLights"
  destroy-method="turnOffLights"/>

从我的实验中,Spring不会自动执行此操作,因此,我正在使用BeanDefinitionRegistry。但是,这涉及隐式删除bean,这是我想避免的。

ApplicationContext ctx = new ClassPathXmlApplicationContext("Beans.xml");

Auditorium auditorium = (Auditorium) ctx.getBean("auditorium");

// Removing the bean from container
BeanDefinitionRegistry factory = (BeanDefinitionRegistry) ctx.getAutowireCapableBeanFactory();
factory.removeBeanDefinition("auditorium");

此外,为了完整的问题,下面是我的Auditorium课程:

public class Auditorium {

    private boolean isLightsOn;

    public Auditorium() {
        isLightsOn = false;
    }

    public void turnOnLights() {
        isLightsOn = true;
        printLights();
    }

    public void turnOffLights() {
        isLightsOn = false;
        printLights();
    }

    public void printLights() {
        if (isLightsOn) {
            System.out.println("Lights are turned on!");
        } else {
            System.out.println("Lights are turned off!");
        }
    }
}

1 个答案:

答案 0 :(得分:3)

当上下文为closedrefreshed时,将调用所有destroy方法。如果您运行独立应用程序,为了确保在应用程序结束之前调用destroy方法,您需要register a shutdown hook

所有这些方法都可以在ConfigurableApplicationContext界面中使用,因此您需要使用它而不仅仅是ApplicationContext(几乎任何您将要使用的上下文都将实现此界面,因此您不需要不用担心):

ConfigurableApplicationContext ctx = new ClassPathXmlApplicationContext("Beans.xml");
ctx.registerShutdownHook(); // this should be it, destroys are called before your app exits

在非独立(托管)方案(如应用程序服务器)中,关闭/刷新上下文会在关闭/重新部署时自动发生,因此您无需执行任何操作。