gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:49:03 34 4
gpt4 key购买 nike

我在 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/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com