一、使用步驟
簡單來說,spring中監聽器的使用分爲兩個步驟:註冊Application監聽器和發佈Application事件。具體實現一下:
1. 自定義事件
spring定義了一個標準的事件抽象類ApplicationEvent,繼承了這個抽象類就是一個Application事件。
public class MyApplicationEvent extends ApplicationEvent {
public MyApplicationEvent(Object source, String msg) {
// 調用父類的構造函數
super(source);
}
}
Spring內部也有許多自己實現的Application事件
2. 自定義監聽器
spring定義了一個標準的監聽器接口ApplicationListener,實現了這個接口的類就是一個Application監聽器。
public class MyApplicationListener implements ApplicationListener<ApplicationEvent> {
@Override
public void onApplicationEvent(ApplicationEvent event) {
if(event instanceof ContextRefreshedEvent){
// spring內部事件
System.out.println("監聽到上下文刷新時間!");
}else if(event instanceof MyApplicationEvent ){
System.out.println("監聽到myApplicationEvent!");
}else{
System.out.println("有其它事件發生:"+event.getClass().getName());
}
}
}
監聽器不僅能監聽到自己手動發佈的事件,也能監聽到Spring內部自己發佈的事件。
ApplicationListener是一個泛型接口,泛型中的類型代表事件類型。監聽器只能監聽到泛型表示的事件或者該事件的子類。
3. 註冊監聽器
<bean id="myApplicationListener" class="com.kaka.spring.context.MyApplicationListener"/>
其實就是把自定義的監聽器當成一個bean實例,註冊到IOC容器中。
4. 發佈自定義事件
public void applicationEventTest() {
// 1. 初始化容器
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("listenerTest.xml");
// 2. 創建自定義的事件
MyApplicationEvent myApplicationEvent = new MyApplicationEvent("test event!");
// 3. 發佈事件
applicationContext.publishEvent(myApplicationEvent);
}
執行結果
二、擴展
- Spring常見內置事件:
- ContextRefreshedEvent:當ApplicationContext初始化或者刷新時觸發該事件.
- ContextClosedEvent:當ApplicationContext被關閉時觸發該事件。容器被關閉時,其管理的所有單例Bean都被銷燬。
- RequestHandleEvent:在Web應用中,當一個http請求(request)結束觸發該事件。
- ContextStartedEvent:Spring2.5新增的事件,當容器調用ConfigurableApplicationContext的Start()方法開始/重新開始容器時觸發該事件。
- ContextStopedEvent:Spring2.5新增的事件,當容器調用ConfigurableApplicationContext的Stop()方法停止容器時觸發該事件。