2

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

我的问题是如何告诉 Spring 在程序终止之前为那些设置了方法的 bean 调用 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");

此外,为了一个完整的问题,下面是我的礼堂课:

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

1 回答 1

3

当上下文关闭刷新时,所有destroy方法都会被调用。如果你运行一个独立的应用程序,为了确保在应用程序结束之前调用destroy方法,你需要注册一个关闭钩子

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

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

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

于 2013-07-05T22:16:25.187 回答