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

守门员444

我目前正在学习和尝试使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java:method()处理错误调用的正确方法

在Java中,this.method()和method()有什么区别?

流星:在Meteor.method中调用异步函数并返回结果

在SpringBoot中,如何确保@Async method1在@Asyn method2之前执行?

在Ruby中如何调度对instance_method的调用?

parent :: method()-调用非静态方法

如何在每个函数调用之前等待setTimeout?

Python中的define_method

VueJs this.method不是函数吗?如何在Vuejs中的另一个方法内部调用一个方法?

在Meteor中的每个Method调用之前和之后运行代码

如何用HTML调用(click)=“ method()”以外的方法

在不覆盖方法的子类中调用super()。method()

index参数如何在Javascript的reduce.method中工作

Java:我该如何减少if(method1()&& method2().... && method25())?

无法使用jQuery ajax调用Page Method

在注册为原型的bean上未调用destroy-method

JavaScript将object [method]扩展到object.method以调用object.method()

提交之前的Spring验证(Method.GET)

如何在之前为uitableviewcell加载图像

PHP:动态调用METHOD

如何在Express中处理“无法<METHOD> <ROUTE>”?

Perl-调用<%method PREPARE>时

如何在curl数组中传递get方法method

如何在系统调用中终止进程?

如何在Android中获取NAMESPACE,SOAP_ACTION,URL和METHOD_NAME来调用SOAP请求

如何测试`alias_method`?

Mockito - 想要但未调用 - interface.method()

调用PUT Method Api后如何重新渲染?

Scala 中的黑白 Method[Int]() 与 Method() 的区别?