没有调用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
onStart
和onStop
覆盖。 在适当的事件发生时,在tomcat中为LifeCycleListener
类似的解决方案。