Bean 生命週期指的是從 Spring 容器創建一個 Bean 到銷燬它的整個過程。Spring 通過管理 Bean 的生命週期來幫助我們控制 Bean 的創建、初始化、使用和銷燬。
Spring Bean 生命週期
- 實例化:
通過構造函數或工廠方法創建 Bean 的實例。 - 屬性賦值(依賴注入):
Spring 會為 Bean 設置依賴的屬性(也就是依賴注入,通常是通過構造器、Setter 方法或者字段注入)。 -
調用 BeanPostProcessor 的 postProcessBeforeInitialization 方法:
在此步驟,Spring 容器會檢查是否有實現了BeanPostProcessor接口的類。如果有,它們會在初始化前對 Bean 進行修改或操作(例如:做一些驗證、修改 Bean 的狀態等)。- BeanPostProcessor 是一個擴展接口,在它實現的
postProcessBeforeInitialization方法中,可以對 Bean 做一些處理。
- BeanPostProcessor 是一個擴展接口,在它實現的
-
初始化方法:
- 如果 Bean 定義了
init-method,Spring 會在此時調用該方法。 - 如果 Bean 實現了
InitializingBean接口,Spring 會調用它的afterPropertiesSet()方法。
- 如果 Bean 定義了
- 調用 BeanPostProcessor 的 postProcessAfterInitialization 方法:
同樣,Spring 容器會檢查是否有BeanPostProcessor,並在 Bean 初始化之後調用它們的postProcessAfterInitialization方法。這使得開發者可以在 Bean 完成初始化後做一些操作。 - 使用 Bean:
經過上面的處理後,Bean 就會在 Spring 容器中處於準備就緒的狀態,可以被應用程序代碼所使用。Bean 會繼續在 Spring 容器中被管理,直到銷燬。 -
銷燬:
當 Spring 容器關閉時,所有的 Bean 會被銷燬。- 如果 Bean 定義了
destroy-method,Spring 會調用該方法。 - 如果 Bean 實現了
DisposableBean接口,Spring 會調用它的destroy()方法。
- 如果 Bean 定義了
Spring Bean 生命週期的詳細流程圖:
+-------------------+
| Bean 被實例化 |
+-------------------+
↓
+-------------------+
| 依賴注入 |
+-------------------+
↓
+-------------------+
| 調用 postProcessBeforeInitialization |
+-------------------+
↓
+-------------------+
| 調用初始化方法 |
| (init-method 或 |
| InitializingBean) |
+-------------------+
↓
+-------------------+
| 調用 postProcessAfterInitialization |
+-------------------+
↓
+-------------------+
| Bean 被使用 |
+-------------------+
↓
+-------------------+
| 容器銷燬 |
+-------------------+
↓
+-------------------+
| 調用 destroy 方法 |
| (destroy-method 或 |
| DisposableBean) |
+-------------------+
具體實現步驟:
-
配置 Bean:
你可以在 Spring 的配置文件(如
applicationContext.xml)中指定init-method和destroy-method:<bean id="myBean" class="com.example.MyBean" init-method="init" destroy-method="cleanup"> <!-- 依賴注入 --> </bean>或者使用註解:
@Component public class MyBean { @PostConstruct public void init() { System.out.println("Bean 初始化"); } @PreDestroy public void cleanup() { System.out.println("Bean 銷燬"); } } -
實現
InitializingBean和DisposableBean:Spring 提供了
InitializingBean和DisposableBean接口,它們分別定義了初始化和銷燬方法。@Component public class MyBean implements InitializingBean, DisposableBean { @Override public void afterPropertiesSet() throws Exception { System.out.println("Bean 初始化"); } @Override public void destroy() throws Exception { System.out.println("Bean 銷燬"); } } -
實現
BeanPostProcessor:BeanPostProcessor是一個接口,它允許在 Bean 的初始化前後進行處理:@Component public class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("Bean 初始化前: " + beanName); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("Bean 初始化後: " + beanName); return bean; } }
生命週期中常用的註解:
@PostConstruct:該註解的方法會在依賴注入完成後、Bean 初始化方法執行之前調用。@PreDestroy:該註解的方法會在銷燬之前執行。
總結:
Spring Bean 的生命週期分為幾個主要的階段:實例化、依賴注入、初始化、銷燬等。在這整個過程中,Spring 提供了多種機制(如 BeanPostProcessor、InitializingBean、DisposableBean、@PostConstruct 和 @PreDestroy)來幫助開發者在不同階段對 Bean 進行定製操作。