關於在spring容器初始化 bean 和銷燬前所作的操做定義方式有三種:java
從Java EE 5規範開始,Servlet中增長了兩個影響Servlet生命週期的註解(Annotion);@PostConstruct和@PreDestroy。這兩個註解被用來修飾一個非靜態的void()方法 。寫法有以下兩種方式:spring
@PostConstruct Public void someMethod() { ..... }
或者緩存
public @PostConstruct void someMethod(){ ..... }
如下爲@PostConstruct的API使用說明:post
PostConstruct 註釋用於在依賴關係注入完成以後須要執行的方法上,以執行任何初始化。此方法必須在將類放入服務以前調用。支持依賴關係注入的全部類都必須支持此註釋。即便類沒有請求注入任何資源,用 PostConstruct 註釋的方法也必須被調用。只有一個方法能夠用此註釋進行註釋。應用 PostConstruct 註釋的方法必須遵照如下全部標準:該方法不得有任何參數,除非是在 EJB 攔截器 (interceptor) 的狀況下,根據 EJB 規範的定義,在這種狀況下它將帶有一個 InvocationContext 對象 ;該方法的返回類型必須爲 void;該方法不得拋出已檢查異常;應用 PostConstruct 的方法能夠是 public、protected、package private 或 private;除了應用程序客戶端以外,該方法不能是 static;該方法能夠是 final;若是該方法拋出未檢查異常,那麼不得將類放入服務中,除非是可以處理異常並可從中恢復的 EJB。this
總結爲一下幾點:spa
實例.net
UserService方法(提供緩存數據):code
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:xml
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 { @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); } } } public BusinessService(){ System.out.println("構造方法被調用"); } public List<String> getList() { return list; } public void setList(List<String> list) { this.list = list; } }
執行結果:對象
構造方法被調用 @PostConstruct方法被調用 用戶:張三 用戶:李四