@Bean属性的destroyMethod解释

Bean 如何销毁

在 Spring 中,destroyMethod = "(inferred)"@Bean 注解的一个特性,表示 Spring 会自动推断 Bean 的销毁方法,而无需显式指定。这是 Spring 4.3+ 版本引入的默认行为,旨在简化配置。


1. destroyMethod = "(inferred)" 的含义

  • 作用:Spring 会自动检查 Bean 是否有常见的销毁方法(如 close()shutdown()),并在容器关闭时调用它。
  • 默认行为:从 Spring 4.3 开始,@BeandestroyMethod 默认值为 (inferred),即自动推断。
  • 等效配置
    @Bean(destroyMethod = "close")  // 显式指定
    // 等价于
    @Bean  // 默认自动推断
    

2. 自动推断的规则

Spring 会按以下顺序查找销毁方法:

  1. 检查 Bean 是否有 close() 方法(如 CuratorFramework.close()DataSource.close())。
  2. 检查是否有 shutdown() 方法(如 ExecutorService.shutdown())。
  3. 如果找到匹配的方法,Spring 会在容器关闭时自动调用它。
  4. 如果未找到,则不执行任何销毁操作。

3. 示例:CuratorFramework 的自动关闭

@Configuration
public class CuratorConfig {

    @Bean  // 默认 destroyMethod = "(inferred)"
    public CuratorFramework curatorFramework() {
        CuratorFramework client = CuratorFrameworkFactory.newClient(
            "localhost:2181",
            new ExponentialBackoffRetry(1000, 3)
        );
        client.start();
        return client;
    }
}
  • 效果:Spring 检测到 CuratorFrameworkclose() 方法,会在应用关闭时自动调用 client.close()

4. 禁用自动推断

如果不想让 Spring 自动推断销毁方法,可以显式设置:

@Bean(destroyMethod = "")  // 禁用自动推断
public MyBean myBean() {
    return new MyBean();
}
  • 适用场景:Bean 没有标准的 close()shutdown() 方法,但需要自定义销毁逻辑(可通过 DisposableBean@PreDestroy 实现)。

5. 与其他销毁方式的对比

方式 适用场景 特点
@Bean(destroyMethod = "close") close() 方法的 Bean 显式指定,推荐
@Bean(destroyMethod = "") 无标准销毁方法 禁用自动推断
@Bean(默认 (inferred) close()/shutdown() 的 Bean 自动推断,简化配置
DisposableBean@PreDestroy 需要复杂销毁逻辑 更灵活,但侵入性强

6. 最佳实践

  1. 优先使用默认推断:如果 Bean 有 close()shutdown(),直接用 @Bean 即可。
  2. 显式指定更清晰:对于关键资源(如数据库连接池),建议显式写 destroyMethod = "close",提高可读性。
  3. 避免资源泄漏:确保所有需要关闭的 Bean(如 Curator、JDBC 连接)都能被 Spring 管理生命周期。

总结

  • destroyMethod = "(inferred)" 是 Spring 4.3+ 的默认行为,会自动调用 close()shutdown()
  • 大多数情况下(如 Curator、JDBC、ExecutorService),无需显式配置。
  • 如果需要禁用推断或自定义销毁逻辑,可通过 destroyMethod = ""DisposableBean 实现。

这样可以确保资源(如 ZooKeeper 连接、线程池)在 Spring 容器关闭时被正确释放。

你可能感兴趣的:(springboot,spring)