@PostConstruct 和 @PreDestroy

Mr_Alexander發表於2016-05-25

spring 容器中的 Bean 是有生命週期的,Spring 允許在 Bean 在初始化完成後以及 Bean 銷燬前執行特定的操作,您既可以通過實現 InitializingBean/DisposableBean 介面來定製初始化之後 / 銷燬之前的操作方法,也可以通過 <bean> 元素的 init-method/destroy-method 屬性指定初始化之後 / 銷燬之前呼叫的操作方法。關於 Spring 的生命週期,筆者在《精通 Spring 2.x—企業應用開發精解》第 3 章進行了詳細的描述,有興趣的讀者可以查閱。

JSR-250 為初始化之後/銷燬之前方法的指定定義了兩個註釋類,分別是 @PostConstruct 和 @PreDestroy,這兩個註釋只能應用於方法上。標註了 @PostConstruct 註釋的方法將在類例項化後呼叫,而標註了 @PreDestroy 的方法將在類銷燬之前呼叫。

package com.baobaotao;import javax.annotation.Resource;import javax.annotation.PostConstruct;import javax.annotation.PreDestroy;public class Boss { @Resource private Car car; @Resource(name = "office") private Office office; @PostConstruct public void postConstruct1(){ System.out.println("postConstruct1"); } @PreDestroy public void preDestroy1(){ System.out.println("preDestroy1"); } …}

 

您只需要在方法前標註 @PostConstruct 或 @PreDestroy ,這些方法就會在 Bean 初始化後或銷燬之前被 Spring 容器執行了。

我們知道,不管是通過實現 InitializingBean /DisposableBean 介面,還是通過 <bean> 元素的init-method/destroy-method 屬性進行配置,都只能為 Bean 指定一個初始化 / 銷燬的方法。但是使用@PostConstruct@PreDestroy 註釋卻可以指定多個初始化 / 銷燬方法,那些被標註@PostConstruct 或 @PreDestroy 註釋的方法都會在初始化 / 銷燬時被執行。

通過以下的測試程式碼,您將可以看到 Bean 的初始化 / 銷燬方法是如何被執行的:


測試程式碼

                
package com.baobaotao;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AnnoIoCTest {

    public static void main(String[] args) {
        String[] locations = {"beans.xml"};
        ClassPathXmlApplicationContext ctx = 
            new ClassPathXmlApplicationContext(locations);
        Boss boss = (Boss) ctx.getBean("boss");
        System.out.println(boss);
        ctx.destroy();// 關閉 Spring 容器,以觸發 Bean 銷燬方法的執行
    }
}

 

這時,您將看到標註了 @PostConstruct 的 postConstruct1() 方法將在 Spring 容器啟動時,建立Boss Bean 的時候被觸發執行,而標註了@PreDestroy 註釋的preDestroy1() 方法將在 Spring 容器關閉前銷燬Boss Bean 的時候被觸發執行。

相關文章