SpringDisposableBean不起作用

SpringDisposableBean不起作用,spring,tomcat,Spring,Tomcat,我正在我的一个bean中实现DisposableBean,以便在服务器关闭时得到通知。但是,从不调用destroy方法 我正在用Spring 3运行Tomcat 有什么建议吗?使用并覆盖contextdestromed方法 不要忘记在web.xml中声明ContextLoaderListener,而不是使用ApplicationContext,使用AbstractApplicationContext。 然后注册相同的代码。如果您正在使用ApplicationContext,Spring不会为桌面

我正在我的一个bean中实现DisposableBean,以便在服务器关闭时得到通知。但是,从不调用destroy方法

我正在用Spring 3运行Tomcat

有什么建议吗?

使用并覆盖
contextdestromed
方法


不要忘记在
web.xml
中声明
ContextLoaderListener
,而不是使用ApplicationContext,使用AbstractApplicationContext。 然后注册相同的代码。如果您正在使用ApplicationContext,Spring不会为桌面应用程序调用DisposableBean

例: AbstractApplicationContext appCxt=新类路径XMLApplicationContext(“spring.xml”); appCxt.registerShutdownHook()

我尝试了这个选项

使用带有
destroy()
方法的
obj
对象,添加以下内容:

Runtime.getRuntime().addShutdownHook(新线程(obj::destroy))


如果它有效,你可能会考虑接受这个答案。谢谢。当然:)最后一件事,为什么春天不为我做呢?DisposableBean是否只在特殊情况下工作?我猜(不确定)当Tomcat宕机时,它只会终止所有线程,而Spring并没有侵入性地保持线程并执行优雅的关闭。我猜DisposableBean只在您完全控制BF生命周期的受控环境中工作。上下文监听器OTOH是Tomcat中的一个标准钩子,所以这是一个完全有效的解决方案。实际上,我尝试了你的解决方案。我可以很容易地获得根上下文,但我需要的是servlet/应用程序上下文。如何访问这些?您需要将Spring的
ContextLoaderListener
放在您需要上下文的webapp的web.xml中。或者,如果您所做的不是特定于Spring的,您可以只使用标准的ServletContextListener,-Spring的listener所做的不比这多。或者,在JNDI中绑定所有必要的对象(例如,在webapp启动时),并在必要时访问这些对象。