一、什么是 Bean 生命周期?
Spring 中的 Bean 生命周期是指一個 Bean 從 被容器創建到 最終銷毀 所經歷的一系列過程。
它體現了 Spring IOC 容器在管理 Bean 實例時所執行的各個鉤子流程,包括初始化、依賴注入、增強處理、銷毀等多個環節。
二、Bean 生命周期完整流程(邏輯順序)
1. 實例化(Constructor)
2. 屬性注入(依賴注入,DI)
3. 感知階段(Aware 接口)
4. 初始化前處理(BeanPostProcessor#postProcessBeforeInitialization)
5. 初始化(@PostConstruct 或 InitializingBean#afterPropertiesSet)
6. 初始化后處理(BeanPostProcessor#postProcessAfterInitialization)
7. Bean 就緒可用
8. 銷毀前處理(@PreDestroy 或 DisposableBean#destroy)
三、生命周期各階段詳細說明
實例化(Instantiation)
- 由
BeanFactory
或ApplicationContext
通過 反射調用構造方法 創建 Bean 實例。 - 此時 Bean 的屬性尚未注入。
public class UserService {public UserService() {System.out.println("構造方法執行:Bean 被實例化");}
}
屬性注入(依賴注入)
- Spring 通過反射將依賴的屬性注入到實例中。
- 包括:
@Autowired
、@Value
、構造器注入等。
感知接口回調(Aware 接口)
如果 Bean 實現了以下接口,Spring 會注入相關上下文信息:
接口名 | 描述 |
---|---|
BeanNameAware | 獲取當前 Bean 的名字 |
BeanFactoryAware | 獲取當前 BeanFactory 實例 |
ApplicationContextAware | 獲取當前 ApplicationContext |
public class MyBean implements BeanNameAware {@Overridepublic void setBeanName(String name) {System.out.println("BeanNameAware:我的名字是 " + name);}
}
初始化前處理(BeanPostProcessor)
- Spring 提供的擴展點之一;
- 所有實現了
BeanPostProcessor
接口的類會在每個 Bean 初始化前后被回調。
public Object postProcessBeforeInitialization(Object bean, String beanName);
初始化(核心)
以下三種初始化方式 Spring 均支持:
方式 | 示例 |
---|---|
注解方式 | @PostConstruct (推薦) |
接口方式 | 實現 InitializingBean 接口的 afterPropertiesSet() 方法 |
XML 配置 | init-method="init" (在 XML 中顯式指定) |
@PostConstruct
public void init() {System.out.println("初始化邏輯執行");
}
初始化后處理(BeanPostProcessor)
- 允許開發者對 Bean 進行增強(如 AOP 就是基于此);
- 可以返回原 Bean,也可以返回代理對象。
public Object postProcessAfterInitialization(Object bean, String beanName);
Bean 就緒可用
- Spring 容器完成了 Bean 的初始化,此時可以被應用程序正常使用;
- Bean 已經具備所有依賴關系,準備投入業務運行。
銷毀階段(Destruction)
Spring 會在容器關閉時銷毀單例 Bean:
銷毀方式 | 示例 |
---|---|
注解方式 | @PreDestroy (推薦) |
接口方式 | 實現 DisposableBean#destroy() |
XML 配置 | destroy-method="destroy" |
@PreDestroy
public void cleanup() {System.out.println("Bean 即將銷毀,釋放資源");
}
注意:默認只銷毀單例 Bean,且前提是容器必須正常關閉,如:
((ConfigurableApplicationContext) context).close();
四、完整生命周期流程示意圖
構造器實例化 →
屬性注入 →
xxxAware 接口 →
postProcessBeforeInitialization →
@PostConstruct / afterPropertiesSet →
postProcessAfterInitialization →
應用使用 →
@PreDestroy / destroy
五、常見問題
Bean 的生命周期中哪個階段可用于增強?
- 答:
BeanPostProcessor
是關鍵,它可以包裹原始 Bean,進行代理或包裝。
Bean 是什么時候被創建的?
- 默認是容器啟動時(單例 Bean);
- 如果是
@Lazy
或prototype
,則是 首次使用時。
Bean 銷毀時會自動釋放資源嗎?
- 只會執行自定義的
destroy()
方法或@PreDestroy
; - 對于像數據庫連接、線程池等,需要手動在銷毀鉤子中關閉資源。
六、總結一
Spring Bean 的生命周期涵蓋:創建 → 初始化 → 可用 → 銷毀 全流程。通過實現各種接口或使用注解(如
@PostConstruct
、@PreDestroy
),可以在各階段插入自定義邏輯,方便資源初始化與釋放。