天天看點

@PostConstruct 注解的作用,用途,執行順序

作者:程式員的秃頭之路

@PostConstruct注解

@PostConstruct注解是Java EE 5規範引入的一種特殊注解,用于标記在依賴注入完成後、初始化方法執行前執行的方法。它屬于javax.annotation包。Spring架構也支援這個注解,并在Bean的生命周期中進行處理。

當Spring容器建立Bean并完成依賴注入後,會檢查Bean中是否有使用@PostConstruct注解的方法。如果存在這樣的方法,Spring容器會在Bean的初始化方法(例如:afterPropertiesSet()或者自定義初始化方法)之前執行這個帶有@PostConstruct注解的方法。這樣,可以確定在初始化方法執行前,相關的資源或配置已經準備就緒。

使用@PostConstruct注解的方法需要滿足以下條件:

1、 該方法不能有參數。

2、 該方法不能有傳回值(即必須是void類型)。

3、 該方法不能抛出已檢查的異常(checked exception)。

4、 該方法應當具有通路權限,以便容器能夠調用它。通常将這類方法設定為public或protected。

示例:

import javax.annotation.PostConstruct;

@Component
public class MyBean {
    
    @Autowired
    private AnotherBean anotherBean;

    @PostConstruct
    public void init() {
        System.out.println("MyBean is being initialized...");
        // 在這裡執行一些依賴于anotherBean的操作
    }
}           

在這個例子中,我們使用@PostConstruct注解标記了init()方法。當Spring容器建立MyBean執行個體并完成依賴注入後,會先調用init()方法進行初始化操作,然後執行其他初始化方法(如afterPropertiesSet()或自定義初始化方法)。

@PostConstruct注解提供了一種簡潔、優雅的方式來定義Bean的初始化操作。通過使用這個注解,我們可以将初始化邏輯與其他業務邏輯分離,提高代碼的可讀性和可維護性。

使用該注解需要滿足以下條件

1、 該注解用于注釋方法 2、 如果注釋的方法在攔截器(interceptor)類中,必須滿足以下兩種格式之一:

void <METHOD>(InvocationContext)
Object <METHOD>(InvocationContext) throws Exception           

3、 如果注釋的方法不是攔截器類,則必須格式為:

void <METHOD>()   //不能有參數,傳回值必須為void, <METHOD>為方法名           

4、 注解的方法的通路修飾符可以是public, protected, package private or private 5、 注釋的方法可以用final修飾 6、 注釋的方法除了應用程式的用戶端(application client)之外,不能是靜态方法 7、 如果該方法抛出未經檢查的異常,則該類不得投入使用

使用場景

@PostConstruct注解通常用于在Spring架構中,指定一個方法在對象建立後立即執行,常用于進行一些初始化操作。

1、 資料庫初始化:在程式啟動時,需要從資料庫中加載資料并進行一些初始化操作。使用@PostConstruct注解可以指定一個方法,在對象建立後立即執行資料庫查詢并将資料緩存到程式的記憶體中。

2、 資源加載:有時候,在程式啟動時需要加載一些資源檔案,如配置檔案、日志檔案等。使用@PostConstruct注解可以在對象建立後立即執行加載資源的操作。

3、 緩存初始化:在某些業務場景下,需要在程式啟動時初始化緩存,以提高後續的資料通路性能。使用@PostConstruct注解可以在對象建立後立即執行緩存初始化的操作,如從資料庫加載資料到緩存中。

4、 Bean依賴關系建立:在Spring架構中,對象之間存在依賴關系,有時候需要在對象建立後立即建立這些依賴關系。通過在依賴注入完成後使用@PostConstruct注解,可以在對象建立後立即執行依賴關系的建立。

總之,@PostConstruct注解适用于那些需要在對象建立後立即執行一些初始化操作的場景。它可以幫助確定對象在使用之前已經完成了必要的準備工作,提高程式的可靠性和性能。

@Autowired注解和Constructor、@PostConstruct的執行順序

在Spring架構中,@Autowired注解和Constructor、@PostConstruct的執行順序如下:

1、 Constructor(構造器):當Spring容器建立Bean執行個體時,首先會調用相應的構造器來執行個體化Bean。如果有多個構造器,可以使用@Autowired注解标注在某個構造器上,以便讓Spring容器知道使用哪個構造器進行執行個體化。

2、 @Autowired(依賴注入):構造器執行完畢後,Spring容器會進行依賴注入。這個過程中,Spring會将标有@Autowired注解的屬性、方法或者構造器參數所需的依賴注入到相應的Bean執行個體中。這樣,Bean執行個體就可以通路到其他被Spring管理的對象。

3、 @PostConstruct(初始化):在依賴注入完成後,Spring容器會調用帶有@PostConstruct注解的方法。該注解标記的方法會在Bean的初始化方法(例如:afterPropertiesSet()或者自定義初始化方法)之前執行。這樣可以確定在初始化方法執行前,相關的資源或配置已經準備就緒。

綜上所述,這三個步驟的執行順序是:Constructor -> @Autowired -> @PostConstruct。

繼續閱讀