🌱 一、什么是 Bean 生命周期?
在 Spring 容器中,一個 Bean 從“創建 → 初始化 → 使用 → 銷毀”,經歷了完整的生命周期。
Spring 提供了 多個擴展點 讓你可以在這些階段做事情,比如注入資源、日志記錄、連接資源、清理工作等等。
🧭 二、完整生命周期流程圖
BeanDefinition 加載↓
實例化(new)↓
依賴注入(@Autowired、@Value)↓
Aware 接口(BeanNameAware、ApplicationContextAware)↓
BeanPostProcessor(初始化前)↓
初始化方法(@PostConstruct / InitializingBean.afterPropertiesSet)↓
BeanPostProcessor(初始化后)↓
Bean 準備就緒,可以使用↓
銷毀前回調(@PreDestroy / DisposableBean.destroy)↓
Bean 被銷毀(容器關閉)
🔧 三、常用生命周期擴展點
階段 | 使用方式 | 示例 |
---|---|---|
實例化后注入前 | 構造器 / @Autowired | 構造函數 + 依賴注入 |
設置 bean 名稱 | BeanNameAware | 獲取當前 Bean 的 ID |
設置容器引用 | ApplicationContextAware | 拿到整個容器對象 |
初始化前 | BeanPostProcessor.postProcessBeforeInitialization() | 可對 Bean 進行加工 |
初始化中 | @PostConstruct 或 InitializingBean | 初始化數據庫連接等 |
初始化后 | BeanPostProcessor.postProcessAfterInitialization() | 可返回代理對象 |
銷毀前 | @PreDestroy 或 DisposableBean | 清理資源、關閉線程等 |
? 1)@PostConstruct / @PreDestroy(推薦方式)
@Component
public class MyBean {@PostConstructpublic void init() {System.out.println("Bean 初始化完成");}@PreDestroypublic void destroy() {System.out.println("Bean 即將銷毀");}
}
? 2)實現接口方式(稍顯傳統)
public class MyBean implements InitializingBean, DisposableBean {public void afterPropertiesSet() {System.out.println("初始化完成");}public void destroy() {System.out.println("銷毀前回調");}
}
? 3)通過配置指定 initMethod / destroyMethod
@Bean(initMethod = "init", destroyMethod = "cleanup")
public MyBean myBean() {return new MyBean();
}
🧠 四、BeanPostProcessor 的作用?
這是一種非常強大的機制:
你可以在 Bean 初始化前后 對所有 Bean 做增強,比如 AOP、自動代理、注入屬性等等。
Spring 的很多高級功能(如 @Transactional
、@Async
)其實都是基于這個機制實現的!
🎯 五、一句話總結
Spring Bean 生命周期 = 一套結構清晰、可定制的生命周期鉤子機制,讓你能夠在合適時機對 Bean 做初始化、增強和清理。
? 實戰建議
情況 | 用法 |
---|---|
需要注入資源后初始化 | @PostConstruct |
需要關閉資源或線程池 | @PreDestroy |
想攔截 Bean 生命周期 | 實現 BeanPostProcessor |
需要容器對象 | 實現 ApplicationContextAware |
對生命周期感興趣 | 打開 debug log,跟蹤 AbstractAutowireCapableBeanFactory |