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