@PostConstruct與@PreDestroy講解及例項

木叔發表於2017-02-17
關於在spring  容器初始化 bean 和銷燬前所做的操作定義方式有三種:
第一種:通過@PostConstruct 和 @PreDestroy 方法 實現初始化後和銷燬bean之前進行的操作
第二種是:通過 在xml中定義init-method 和  destory-method方法
第三種是: 通過bean實現InitializingBean和 DisposableBean介面
 
此處介紹第一種方法:
 
從Java EE 5規範開始,Servlet中增加了兩個影響Servlet生命週期的註解(Annotion);@PostConstruct和@PreDestroy。這兩個註解被用來修飾一個非靜態的void()方法 。寫法有如下兩種方式:
@PostConstruct
Public void someMethod() {
}
或者
public @PostConstruct void someMethod(){
}

 

被@PostConstruct修飾的方法會在伺服器載入Servle的時候執行,並且只會被伺服器執行一次。PostConstruct在建構函式之後執行,init()方法之前執行。PreDestroy()方法在destroy()方法執行執行之後執行,如下:
被註解的Servlet生命週期:
 
需要注意的是,註解會多多少少地影響到伺服器的啟動速度。伺服器在啟動時候會遍歷Web 應用的WEB-INF/classes下的所有class檔案與WEB-INF/lib下的所有jar檔案,以檢查哪些類使用了註解。如果應用程式中沒有 使用任何註解,可以在Web.xml中設定的metadata-complete屬性為true.(支援@PostConstruct和 @PreDestroy的伺服器需要支援Servlet2.5規範。Tomcat5.x僅支援Servlet2.4規範。)
 
我現在要說的是用例項說明它有什麼作用。
比如說我有一種情況,在我的servlet初始化載入之前我想處理一些東西,像載入快取等等。
怎麼做。@PostConstruct就派上用場了。那為什麼這玩意用的不多呢,這是因為如果初始化之前我們要載入或處理某些玩意完全可以在構造器初始化時就處理了,但這種方法需要自己重寫構造器。
用法如下:
@Service("AjaxCacheableService")
public class AjaxCacheableService{
 
@Resource(name="cacheService")
protected CacheService cacheService;
 
protected int entityCacheMaxSize = 1000;
protected int entityCacheMaxLiveSeconds = 3600;
protected Cache entityCache;
 
/**
* 構造方法執行後,初始化,
*/
@PostConstruct
public void init() {
Assert.notNull(cacheService, "cacheService must be set!");
getCache();
}

}

 

 
 

相關文章