1. 程式人生 > >Spring/SpringMVC在啟動完成後執行方法

Spring/SpringMVC在啟動完成後執行方法

或者使用xml配置方式(非註解),簡單配置個bean即可 <bean id="beanDefineConfigue" class="com.creatar.portal.webservice.BeanDefineConfigue"></bean> 其他定義方式: 完整的類如下: package com.creatar.portal.webservice; import java.util.ArrayList; import java.util.List; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.stereotype.Component; @Component("BeanDefineConfigue2") public class BeanDefineConfigue2 implements ApplicationListener<ApplicationEvent> { List<String> list = new ArrayList<String>(); /** * 當一個ApplicationContext被初始化或重新整理觸發 */ @Override public void onApplicationEvent(ApplicationEvent event) { if (event instanceof ContextRefreshedEvent) { System.out.println("spring容易初始化完畢================================================888"); } } } spring其他事件: spring中已經內建的幾種事件: ContextClosedEvent   、ContextRefreshedEvent  、ContextStartedEvent  、ContextStoppedEvent   、RequestHandleEvent 後續研究: applicationontext和使用MVC之後的webApplicationontext會兩次呼叫上面的方法,如何區分這個兩種容器呢? 但是這個時候,會存在一個問題,在web 專案中(spring mvc),系統會存在兩個容器,一個是root application context ,另一個就是我們自己的 projectName-servlet context(作為root application context的子容器)。 這種情況下,就會造成onApplicationEvent方法被執行兩次。為了避免上面提到的問題,我們可以只在root application context初始化完成後呼叫邏輯程式碼,其他的容器的初始化完成,則不做任何處理,修改後程式碼 如下:     @Override        public void onApplicationEvent(ContextRefreshedEvent event) {          if(event.getApplicationContext().getParent() == null){//root application context 沒有parent,他就是老大.               //需要執行的邏輯程式碼,當spring容器初始化完成後就會執行該方法。          }        }  後續發現加上以上判斷還是能執行兩次,不加的話三次,最終研究結果使用以下判斷更加準確:event.getApplicationContext().getDisplayName().equals("Root WebApplicationContext")