Spring 內建五種標準應用程式上下文事件,分別對應容器生命週期的關鍵節點:
ConfigurableApplicationContext.start() 時觸發。ConfigurableApplicationContext.stop() 時觸發。實作 ApplicationListener 介面,在 onApplicationEvent 中判斷事件型別並處理:
public class ApplicationEventListener implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ContextRefreshedEvent) {
System.out.println("ContextRefreshedEvent 事件已發生!");
} else if (event instanceof ContextClosedEvent) {
System.out.println("ContextClosedEvent 事件已發生!");
} else if (event instanceof ContextStartedEvent) {
System.out.println("ContextStartedEvent 事件已發生!");
} else if (event instanceof ContextStoppedEvent) {
System.out.println("ContextStoppedEvent 事件已發生!");
} else {
System.out.println("其他事件:" + event.getClass().getName());
}
}
}
在 XML 中宣告監聽器 Bean:
<bean id="applicationEventListener" class="ioc.test.ApplicationEventListener" />
測試類別依序呼叫 start()、stop()、close() 觸發對應事件:
public class TestMain {
public static void main(String[] args) {
AbstractApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
ac.start(); // 觸發 ContextStartedEvent
ac.stop(); // 觸發 ContextStoppedEvent
ac.close(); // 觸發 ContextClosedEvent
}
}
控制台輸出確認事件順序正確。重點在於:只要將監聽器註冊為 Bean,ApplicationContext 即會自動發現並註冊,無需額外設定。