博客 / 詳情

返回

Spring Bean 生命週期

Bean 生命週期指的是從 Spring 容器創建一個 Bean 到銷燬它的整個過程。Spring 通過管理 Bean 的生命週期來幫助我們控制 Bean 的創建、初始化、使用和銷燬。

Spring Bean 生命週期

  1. 實例化
    通過構造函數或工廠方法創建 Bean 的實例。
  2. 屬性賦值(依賴注入)
    Spring 會為 Bean 設置依賴的屬性(也就是依賴注入,通常是通過構造器、Setter 方法或者字段注入)。
  3. 調用 BeanPostProcessor 的 postProcessBeforeInitialization 方法
    在此步驟,Spring 容器會檢查是否有實現了 BeanPostProcessor 接口的類。如果有,它們會在初始化前對 Bean 進行修改或操作(例如:做一些驗證、修改 Bean 的狀態等)。

    • BeanPostProcessor 是一個擴展接口,在它實現的 postProcessBeforeInitialization 方法中,可以對 Bean 做一些處理。
  4. 初始化方法

    • 如果 Bean 定義了 init-method,Spring 會在此時調用該方法。
    • 如果 Bean 實現了 InitializingBean 接口,Spring 會調用它的 afterPropertiesSet() 方法。
  5. 調用 BeanPostProcessor 的 postProcessAfterInitialization 方法
    同樣,Spring 容器會檢查是否有 BeanPostProcessor,並在 Bean 初始化之後調用它們的 postProcessAfterInitialization 方法。這使得開發者可以在 Bean 完成初始化後做一些操作。
  6. 使用 Bean
    經過上面的處理後,Bean 就會在 Spring 容器中處於準備就緒的狀態,可以被應用程序代碼所使用。Bean 會繼續在 Spring 容器中被管理,直到銷燬。
  7. 銷燬
    當 Spring 容器關閉時,所有的 Bean 會被銷燬。

    • 如果 Bean 定義了 destroy-method,Spring 會調用該方法。
    • 如果 Bean 實現了 DisposableBean 接口,Spring 會調用它的 destroy() 方法。

Spring Bean 生命週期的詳細流程圖:

+-------------------+
| Bean 被實例化      |
+-------------------+
          ↓
+-------------------+
| 依賴注入           |
+-------------------+
          ↓
+-------------------+
| 調用 postProcessBeforeInitialization |
+-------------------+
          ↓
+-------------------+
| 調用初始化方法     |
| (init-method 或  |
| InitializingBean) |
+-------------------+
          ↓
+-------------------+
| 調用 postProcessAfterInitialization |
+-------------------+
          ↓
+-------------------+
| Bean 被使用       |
+-------------------+
          ↓
+-------------------+
| 容器銷燬          |
+-------------------+
          ↓
+-------------------+
| 調用 destroy 方法  |
| (destroy-method 或 |
| DisposableBean)   |
+-------------------+

具體實現步驟:

  1. 配置 Bean

    你可以在 Spring 的配置文件(如 applicationContext.xml)中指定 init-methoddestroy-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 銷燬");
        }
    }
  2. 實現 InitializingBeanDisposableBean

    Spring 提供了 InitializingBeanDisposableBean 接口,它們分別定義了初始化和銷燬方法。

    @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 銷燬");
        }
    }
  3. 實現 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 提供了多種機制(如 BeanPostProcessorInitializingBeanDisposableBean@PostConstruct@PreDestroy)來幫助開發者在不同階段對 Bean 進行定製操作。

user avatar ruozxby 頭像
1 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.