我目前正在学习并试验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!");
}
}
}
答案 0 :(得分:3)
当上下文为closed或refreshed时,将调用所有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
在非独立(托管)方案(如应用程序服务器)中,关闭/刷新上下文会在关闭/重新部署时自动发生,因此您无需执行任何操作。