簡介
?
前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。
?
Java EE5 引入了@PostConstruct和@PreDestroy這兩個作用于Servlet生命周期的注解,實現Bean初始化之前和銷毀之前的自定義操作。此文主要說明@PostConstruct。
API使用說明
以下為@PostConstruct的API使用說明:
1. PostConstruct 注釋用于在依賴關系注入完成之后需要執行的方法上,以執行任何初始化。
2. 此方法必須在將類放入服務之前調用。
3. 支持依賴關系注入的所有類都必須支持此注釋。
4. 即使類沒有請求注入任何資源,用 PostConstruct 注釋的方法也必須被調用。
5. 只有一個方法可以用此注釋進行注釋。
?
6. 應用 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
public class UserService {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
public class BusinessService {@Autowiredprivate UserService userService;private List<String> list = null;/*** 構造方法執行之后,調用此方法*/@PostConstructpublic 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);}}}public BusinessService(){System.out.println("構造方法被調用");}public List<String> getList() {return list;}public void setList(List<String> list) {this.list = list;}
}
執行結果:
構造方法被調用
@PostConstruct方法被調用
用戶:張三
用戶:李四
項目應用
在項目中@PostConstruct主要應用場景是在初始化Servlet時加載一些緩存數據等。
注意事項
使用此注解時會影響到服務的啟動時間。服務器在啟動時會掃描WEB-INF/classes的所有文件和WEB-INF/lib下的所有jar包。
?
-------------------------------------------------- 我是分隔線? ----------------------------------------------------------------
?
關于在 spring ?容器初始化 bean 和銷毀前所做的操作定義方式有三種:
第一種:通過 @PostConstruct 和 @PreDestroy 方法 實現初始化和銷毀 bean 之前進行的操作
第二種:通過 在 xml 中定義 init-method 和 ?destory-method 方法
第三種:?通過 bean 實現 InitializingBean 和 DisposableBean 接口
?
轉自:https://blog.csdn.net/topwqp/article/details/8681497
? ? ? ? ? ?https://blog.csdn.net/wo541075754/article/details/52174900