我目前正在学习和尝试使用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!");
}
}
}
destroy
当上下文关闭或刷新时,将调用所有方法。如果您运行一个独立的应用程序,为了确保在应用程序结束之前调用destroy方法,您需要注册一个shutdown hook。
所有这些方法在ConfigurableApplicationContext
界面中都可用,因此您需要使用它而不是仅仅使用ApplicationContext
(几乎所有要使用的上下文都将实现此接口,因此您不必担心):
ConfigurableApplicationContext ctx = new ClassPathXmlApplicationContext("Beans.xml");
ctx.registerShutdownHook(); // this should be it, destroys are called before your app exits
在非独立(托管)方案(例如应用程序服务器)中,关闭/刷新上下文会在关闭/重新部署时自动发生,因此您无需执行任何操作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句