spring - 未调用 Spring 单例 bean 的 @PreDestroy 方法

标签 spring

我在 beans.xml 中定义了一个 Spring bean,如下所示:

<context:annotation-config />
[...]
<bean id="myBackend" class="mycompany.BackendBean" scope="singleton" />

bean 内部有 2 个方法,必须在 Web 应用程序启动和终止之前执行:

public class BackendBean implements IBackend {
    private static final Logger LOGGER = LoggerFactory
            .getLogger(BackendBean.class);

    @PostConstruct
    public void init()
    {
        LOGGER.debug("init");
    }

    @PreDestroy
    public void destroy()
    {
        LOGGER.debug("destroy");
    }
}

当我运行服务器(mvn jetty:run)时,我可以在控制台中看到init方法的输出,由此我得出结论是init 方法被执行。

当我按下 Ctrl-C 并且 Jetty 开始关闭时,我看不到 destroy 方法的输出。

当应用程序终止时,为了执行 destroy 方法,我应该进行哪些更改?

最佳答案

要让 Spring 在您的应用程序关闭时调用 @PreDestroy 回调方法,您必须添加一个关闭 Hook 并关闭它所在的应用程序上下文。您可以使用 将 Hook 附加到 JVM Runtime.getRuntime().addShutdownHook(Thread) 或 Jetty,如果它提供了这样的 API。以下是使用 JVM 关闭 Hook 的方法:

final ApplicationContext appContext = ... // create your application context 
                         // using one of the various application context classes
Runtime.getRuntime().addShutdownHook(new Thread() {
   public void run() {
       appContext.close();
   }});

关于spring - 未调用 Spring 单例 bean 的 @PreDestroy 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16373276/

相关文章:

java - Spring 安全3 : Problem autowiring UserDetailsManager/JdbcUserDetailsManager

java - Spring Beans 中的构造函数参数太多

使用 slf4j 进行日志记录的 spring aspectj 切入点

java - Hibernate 4(使用 Atomikos 事务管理器的 Jpa 2.0 + Jta)未将对象保存在 mysql 模式中

java - 同步块(synchronized block)抛出 DuplicateKeyException

java - 如何在 Spring 中提高具有更大结果集的查询执行的性能

java - API 描述未显示在 Swagger UI 中

java - spring 4 ajax 响应 406 Not Acceptable

java - 你如何告诉 Maven 运行哪些测试?

java - Spring Batch 2.2.7 中的 StepExecutionListener 缺少 onErrorInStep() 方法