Spring Boot - 不再在配置上调用destroy()

时间:2015-03-18 19:17:54

标签: spring groovy spring-boot

我有一个使用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()方法的日志中看到一些条目,但比以前少得多。

2 个答案:

答案 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之前,此界面扩展了DisposableBeanBeanFactoryAware。在4.1.3及更高版本中,它现在仅扩展BeanFactoryAware。从Spring容器的角度来看,这意味着您的Application类正在实现DisposableBean,但它现在不再存在。

您应该明确需要调用destroy(),而不是依赖于框架的实现细节。您可以使用DisposableBean实施@PreDestroy或注释您的方法。