關於在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(); } }