@bean 注解可通过 initmethod 和 destroymethod 参数指定初始化与销毁方法,要求方法为 public 无参 void 类型、名称严格匹配,且仅单例 bean 自动触发 destroymethod;prototype bean 的 destroymethod 不生效。

在 Java 中,@Bean 注解本身不直接提供 initMethod 和 destroyMethod 属性,但你可以在 @Bean 上通过参数显式指定这两个生命周期钩子方法。
@Bean 中配置 initMethod 和 destroyMethod 的写法
标准写法是在 @Bean 注解中传入 initMethod 和 destroyMethod 字符串参数,值为对应 Bean 类中 public 无参方法的名称:
-
initMethod:指定初始化方法,在 Bean 实例化、依赖注入完成后被调用 -
destroyMethod:指定销毁方法,在容器关闭时(仅对单例 Bean 有效)被调用
示例代码:
@Configuration
public class AppConfig {
@Bean(initMethod = "init", destroyMethod = "cleanup")
public MyService myService() {
return new MyService();
}
}
对应的 MyService 类需定义匹配的方法:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
public class MyService {
public MyService() {
System.out.println("构造完成");
}
public void init() {
System.out.println("initMethod 执行");
}
public void cleanup() {
System.out.println("destroyMethod 执行");
}
}
必须满足的条件
要让 initMethod 和 destroyMethod 正常生效,需注意以下几点:
- 目标方法必须是 public、无参、返回 void
- 方法名必须与
@Bean中指定的字符串完全一致(区分大小写) - Bean 必须是单例(默认 scope),否则
destroyMethod不会被容器自动调用 - 容器关闭前必须调用
context.close()(如AnnotationConfigApplicationContext),否则销毁方法不会触发
多实例(prototype)下的行为差异
当 Bean 被标记为多例时,initMethod 会在每次 getBean() 时执行,但 destroyMethod 完全不会由容器调用:
- 即使你在
@Bean中写了destroyMethod = "cleanup",容器也忽略它 - 若需清理资源,必须由调用方手动调用该方法
- 推荐对 prototype Bean 使用
@PreDestroy注解方式(需配合@Scope("prototype")+ 自定义销毁逻辑)或自行管理生命周期
常见误区提醒
容易混淆的几个点:
-
destroyMethod = ""(空字符串)表示禁用自动销毁方法,防止父类有close()或destroy()被误调 - 不要把
@PostConstruct和@PreDestroy与initMethod/destroyMethod混用在同一方法上,优先级不同且可能重复执行 - 如果同时实现了
InitializingBean接口并设置了initMethod,Spring 会先调用接口方法,再调用自定义 init 方法(除非禁用)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










