注解@PostConstruct與@PreDestroy 特性說明


簡介

Java EE5 引入了@PostConstruct和@PreDestroy這兩個作用於Servlet生命周期的注解,實現Bean初始化之前和銷毀之前的自定義操作。此文主要說明@PostConstruct。

API使用說明

以下為@PostConstruct的API使用說明:

PostConstruct 注釋用於在依賴關系注入完成之后需要執行的方法上,以執行任何初始化。

此方法必須在將類放入服務之前調用。

支持依賴關系注入的所有類都必須支持此注釋。即使類沒有請求注入任何資源,用 PostConstruct 注釋的方法也必須被調用。

只有一個方法可以用此注釋進行注釋。

應用 PostConstruct 注釋的方法必須遵守以下所有標准:

1、該方法不得有任何參數,除非是在 EJB 攔截器 (interceptor) 的情況下,根據 EJB 規范的定義,在這種情況下它將帶有一個 InvocationContext 對象 ;

2、該方法的返回類型必須為 void;該方法不得拋出已檢查異常;

3、應用 PostConstruct 的方法可以是 public、protected、package private 或 private;

4、除了應用程序客戶端之外,該方法不能是 static;

5、該方法可以是 final;

6、如果該方法拋出未檢查異常,那么不得將類放入服務中,除非是能夠處理異常並可從中恢復的 EJB。

總結為一下幾點:

  • 只有一個方法可以使用此注釋進行注解;
  • 被注解方法不得有任何參數;
  • 被注解方法返回值為void;
  • 被注解方法不得拋出已檢查異常;
  • 被注解方法需是非靜態方法;
  • 此方法只會被執行一次;

Servlet執行流程圖

兩個注解加入只會,Servlet執行流程圖: 
這里寫圖片描述

在具體Bean的實例化過程中,@PostConstruct注釋的方法,會在構造方法之后,init方法之前進行調用。

實例

基於Spring boot編寫的可執行方法見github:https://github.com/HappySecondBrother/example 

BusinessService方法,通過@PostConstruct調用UserService:

package com.secbro.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import java.util.List; /** * @author 二師兄 * @date 2016/8/10 */ @Service public class BusinessService { /** * 構造方法執行之后,調用此方法 */ @PostConstruct public void init(){ System.out.println("@PostConstruct方法被調用"); } public BusinessService(){ System.out.println("構造方法被調用"); } } 

 

執行結果:

構造方法被調用
@PostConstruct方法被調用

項目應用

在項目中@PostConstruct主要應用場景是在初始化Servlet時加載一些緩存數據等。

注意事項

使用此注解時會影響到服務的啟動時間。服務器在啟動時會掃描WEB-INF/classes的所有文件和WEB-INF/lib下的所有jar包。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM