今天講下在項目中用@PostConstruct,@PreDestory的知識點。
=================================
從JavaEE5開始,Servlet中增加了兩個影響Servlet生命周期的注解,@PostConstruct與@PreDestory,這兩個注解用來修飾一個非靜态的void()方法,而且這個方法不能抛出異常聲明。使用注解修飾方法的時候可以寫在方法的前面,也可以寫在傳回類型或者void的前面。
@PostConstruct
public void someMethod(){....}
public @PreDestroy void anothedMethod(){....}
=================================
那麼首先看下@PostConstruct源碼注釋
其實從依賴注入的字面意思就可以知道,要将對象a注入到對象b,那麼首先就必須得生成對象a與對象b,才能執行注入。是以,如果一個類A中有個成員變量p被@Autowired注解,那麼@Autowired注入是發生在A的構造方法執行完之後的。
如果想在生成對象時候完成某些初始化操作,而偏偏這些初始化操作又依賴于依賴注入,那麼就無法在構造函數中實作。為此,可以使用@PostConstruct注解一個方法來完成初始化,@PostConstruct注解的方法将會在依賴注入完成後被自動調用。
================================
執行個體說明它有什麼作用
比如說我有一種情況,在我的servlet初始化加載之前我想處理一些東西,像加載緩存等等。
================================
PostConstruct注釋規則
1. 除了攔截器這個特殊情況以外,其他情況都不允許有參數,否則spring架構會報IllegalStateException;而且傳回值要是void,但實際也可以有傳回值,至少不會報錯,隻會忽略
2. 方法随便你用什麼權限來修飾,public、protected、private都可以,反正功能是由反射來實作
3. 方法不可以是static的,但可以是final的
是以,綜上所述,在spring項目中,在一個bean的初始化過程中,方法執行先後順序為
Constructor(構造方法)>@Autowired(依賴入)>@PostConstruct(注釋的方法),先執行完構造方法,再注入依賴,最後執行初始化操作,是以這個注解就避免了一些需要在構造方法裡使用依賴元件的問題。
被@PostConstruct修飾的方法會在伺服器加載Servle的時候運作,并且隻會被伺服器執行一次。PostConstruct在構造函數之後執行,init()方法之前執行。PreDestroy()方法在destroy()方法執行執行之後執行。
=================================
下面用代碼看下生命周期中@PostConstruct和@PreDestory運作順序
==============================
被注解的Servlet生命周期
需要注意的是,注解會多多少少地影響到伺服器的啟動速度。伺服器在啟動時候會周遊Web 應用的WEB-INF/classes下的所有class檔案與WEB-INF/lib下的所有jar檔案,以檢查哪些類使用了注解。如果應用程式中沒有使用任何注解,可以在Web.xml中設定的metadata-complete屬性為true.(支援@PostConstruct和 @PreDestroy的伺服器需要支援Servlet2.5規範。Tomcat5.x僅支援Servlet2.4規範。)
=================================
記錄學習,每天進步一點點的橘子大王。