我有一个使用Spring Boot 1.1.8的应用程序,我有一个核心配置类(Application.groovy),它实现了一个自定义的destroy()方法,它做了一些整理:
@Configuration
@ComponentScan
@EnableAsync(proxyTargetClass=true)
@EnableAutoConfiguration
class Application extends SpringBootServletInitializer {
...
public void destroy() {
//do cleanup stuff
}
}
一切运行正常 - 我看到以下日志消息(以及许多其他调用销毁消息):
o.s.b.f.support.DisposableBeanAdapter : Invoking destroy() on bean with name 'application'
我现在已升级到Spring Boot的1.2.2并且不再调用destroy方法 - 任何人都知道为什么停止调用它?我仍然在调用destroy()方法的日志中看到一些条目,但比以前少得多。
答案 0 :(得分:2)
类层次结构中的某些内容发生了变化。您的类不再(隐式)继承DisposableBean
(其中void destroy()
是唯一的函数)。让您的代码实现该接口(并在您的方法上放置@Override
以获得良好的衡量标准)。或者添加@PreDestroy
注释。详细信息位于the docs
每个
SpringApplication
将向JVM注册一个关闭钩子,以确保在退出时正常关闭ApplicationContext
。可以使用所有标准的Spring生命周期回调(例如DisposableBean
接口或@PreDestroy
注释)。
答案 1 :(得分:1)
行为差异的原因相当微妙,而且归因于change in Spring Framework 4.1.3。
Spring Framework为每个@Configuration
类创建一个CGLib代理,该代理实现(内部)EnhancedConfiguration
接口。在4.1.3之前,此界面扩展了DisposableBean
和BeanFactoryAware
。在4.1.3及更高版本中,它现在仅扩展BeanFactoryAware
。从Spring容器的角度来看,这意味着您的Application类正在实现DisposableBean
,但它现在不再存在。
您应该明确需要调用destroy()
,而不是依赖于框架的实现细节。您可以使用DisposableBean
实施@PreDestroy
或注释您的方法。