我們知道,一般來說一個項目啟動時需要加載或者執行一些特殊的任務來初始化系統,通常的做法就是用servlet去初始化,但是servlet在使用spring bean時不能直接注入,還需要在web.xml配置,比較麻煩。今天介紹一下使用spring啟動初始化的方法。其實很簡單,只需兩步就可以了。
在開發時有時候需要在整個應用開始運行時執行一些特定代碼,比如初始化環境,准備測試數據、加載一些數據到內存等等。
在spring中可以通過ApplicationListener來實現相關的功能,加載完成后觸發contextrefreshedevent事件(上下文件刷新事件)
但是這個時候,會存在一個問題,在web 項目中(spring mvc),系統會存在兩個容器,一個是root application context ,另一個就是我們自己的 projectName-servlet context(作為root application context的子容器)。
這種情況下,就會造成onApplicationEvent方法被執行兩次。為了避免上面提到的問題,我們可以只在root application context初始化完成后調用邏輯代碼,其他的容器的初始化完成,則不做任何處理,修改后代碼
- 實現ApplicationListener接口:
public class Init implements ApplicationListener<ContextRefreshedEvent>{ @Override public void onApplicationEvent(ContextRefreshedEvent event) { if(event.getApplicationContext().getParent() == null){//root application context 沒有parent //TODO 這里寫下將要初始化的內容 } } }
2. 在spring applicationContex.xml中配置該bean
<bean id="cmsApplicationListener" class="com.xx.xxx.Init"/>
這樣服務啟動時,就會自動加載並執行了。
后續發現加上以上判斷還是能執行兩次,不加的話三次,最終研究結果使用以下判斷更加准確:event.getApplicationContext().getDisplayName().equals("Root WebApplicationContext")