没有调用Spring单例bean的@PreDestroy方法

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

  [...]  

bean内部有两个方法,必须在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回调方法,您必须添加一个关闭钩子并关闭它所在的应用程序上下文。您可以使用Runtime.getRuntime().addShutdownHook(Thread)或Jetty将钩子附加到JVM Runtime.getRuntime().addShutdownHook(Thread)如果它提供这样的API。 以下是使用JVM关闭钩子的方法:

 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来照顾这个。 除非我误解了您的问题,否则您可以使用容器应用程序生命周期。

尝试编写LifeCycle(jetty)和LifeCycleListener(tomcat)并在LifeCyle onStartonStop覆盖。 在适当的事件发生时,在tomcat中为LifeCycleListener类似的解决方案。