註解@PostConstruct與@PreDestroy詳解及實例

簡介

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

1.@PostConstruct說明

     被@PostConstruct修飾的方法會在服務器加載Servlet的時候運行,並且只會被服務器調用一次,類似於Serclet的inti()方法。被@PostConstruct修飾的方法會在構造函數之後,init()方法之前運行。

2.@PreConstruct說明

     被@PreConstruct修飾的方法會在服務器卸載Servlet的時候運行,並且只會被服務器調用一次,類似於Servlet的destroy()方法。被@PreConstruct修飾的方法會在destroy()方法之後運行,在Servlet被徹底卸載之前。


API使用說明

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

PostConstruct 註釋用於在依賴關係注入完成之後需要執行的方法上,以執行任何初始化。此方法必須在將類放入服務之前調用。支持依賴關係注入的所有類都必須支持此註釋。即使類沒有請求注入任何資源,用 PostConstruct 註釋的方法也必須被調用。只有一個方法可以用此註釋進行註釋。應用 PostConstruct 註釋的方法必須遵守以下所有標準:該方法不得有任何參數,除非是在 EJB 攔截器 (interceptor) 的情況下,根據 EJB 規範的定義,在這種情況下它將帶有一個 InvocationContext 對象 ;該方法的返回類型必須爲 void;該方法不得拋出已檢查異常;應用 PostConstruct 的方法可以是 public、protected、package private 或 private;除了應用程序客戶端之外,該方法不能是 static;該方法可以是 final;如果該方法拋出未檢查異常,那麼不得將類放入服務中,除非是能夠處理異常並可從中恢復的 EJB。

總結爲一下幾點:

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

Servlet執行流程圖

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

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

實例

基於spring boot編寫的可執行方法見github:https://github.com/HappySecondBrother/example 
UserService方法(提供緩存數據):

package com.secbro.service;

import org.springframework.stereotype.Service;

import java.util.ArrayList;

import java.util.List;

/**

*@author 二師兄 

* @date 2016/8/10

*/@Service

publicclassUserService {

	public List<String> getUser(){

		List<String> list =new ArrayList<>();

		list.add("張三");

		list.add("李四");

		return list; 

	}

}


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

publicclassBusinessService {

	@Autowired

	private UserService userService; 

	private List<String> list = null;

	/**

	* 構造方法執行之後,調用此方法

	*/
	@PostConstruct

	public void init(){

		System.out.println("@PostConstruct方法被調用");

		// 實例化類之前緩存獲得用戶信息

		List<String> list = userService.getUser();

		this.list = list; 

		if(list != null && !list.isEmpty()){ 
	
			for(String user : list){ 

				System.out.println("用戶:" + user); 

			}

		}

	}

	publicBusinessService(){

		System.out.println("構造方法被調用");

	}

	public List<String> getList() { 

		return list; 

	}

	public void setList(List<String> list) { 

		this.list = list; 

	}

}


執行結果:

構造方法被調用

@PostConstruct方法被調用

用戶:張三

用戶:李四


項目應用

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

注意事項

註解會多多少少地影響到服務器的啓動速度。服務器在啓動時候會遍歷Web 應用的WEB-INF/classes下的所有class文件與WEB-INF/lib下的所有jar文件,以檢查哪些類使用了註解。如果應用程序中沒有 使用任何註解,可以在Web.xml中設置的metadata-complete屬性爲true.(支持@PostConstruct和 @PreDestroy的服務器需要支持Servlet2.5規範。Tomcat5.x僅支持Servlet2.4規範。Tomcat6.0.X及以上版本支持Servlet2.5及以上規範

發佈了23 篇原創文章 · 獲贊 40 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章