Bean的生命周期
Bean的生命周期指的是从创建到销毁的整个过程,通常由Spring IoC容器管理。以下是Bean生命周期的关键阶段:
实例化:容器通过构造器或工厂方法创建Bean的实例。此时对象尚未初始化,属性未注入。
属性赋值:
容器根据配置(如XML、注解)为Bean注入依赖项,包括基本类型、集合、引用其他Bean等。
初始化前处理
若Bean实现接口,容器会调用对应方法(如
setBeanName()
)传递相关信息。自定义初始化
调用
InitializingBean
接口的afterPropertiesSet()
方法,或执行通过@PostConstruct
注解或XML配置的init-method
指定的方法。Bean可用
完成初始化后,Bean进入可用状态,可被其他对象依赖或通过容器获取。
销毁前处理
容器关闭时,若Bean实现
DisposableBean
接口,会调用destroy()
方法,或执行通过@PreDestroy
注解或XML配置的destroy-method
指定的方法。
生命周期扩展点
开发者可通过以下方式干预生命周期:
- Aware接口 :如
ApplicationContextAware
可获取Spring上下文。 - BeanPostProcessor:在初始化前后插入自定义逻辑,适用于所有Bean。
- InstantiationAwareBeanPostProcessor:在实例化前后介入,影响Bean创建。

ctx.registerShutdownHook() 和 ctx.close() 的区别
在 Spring 应用生命周期管理中,registerShutdownHook()
和 close()
都是用于关闭应用上下文的方法,但它们的触发时机和用途存在差异。
registerShutdownHook()
- 注册一个 JVM 关闭钩子(Shutdown Hook),在 JVM 即将关闭时自动调用
close()
方法清理资源。 - 适用于需要优雅关闭的场景(如释放数据库连接、停止后台线程等)。
- 通常在主程序启动时调用,确保应用退出时触发清理逻辑。
close()
- 直接手动关闭应用上下文,立即释放资源。
- 适用于需要显式控制关闭时机的场景(如测试用例结束后)。
- 调用后上下文无法再次使用,需重新创建。
registerShutdownHook()位置可以换,放在哪儿都优雅的执行,close()放在前面会即刻关闭,后面其他内容不再执行,但是会执行destory()。
关键差异
触发方式
registerShutdownHook()
依赖 JVM 关闭信号(如Ctrl+C
或kill
命令)。close()
需显式调用,不依赖外部事件。执行时机
- Shutdown Hook 在 JVM 退出前异步执行。
close()
同步执行且立即生效。典型用途
- 生产环境推荐使用
registerShutdownHook()
确保资源清理。- 测试或脚本中可手动调用
close()
精确控制生命周期。
注意事项
- 两者均会触发
@PreDestroy
方法和DisposableBean
接口的实现。 - 避免重复调用
close()
,可能导致异常。 - Spring Boot 的
SpringApplication
默认会注册 Shutdown Hook,无需手动调用。


