每天分享一個Java知識點,碼字不易,喜歡的可以關注一波,共同學習。20191128
1. 在spring中是通過ApplicationEvent類和ApplicationListener接口來處理事件的,如果某個bean實現了ApplicationListener接口並被部署到容器中,那麼每次對應的ApplicationEvent被髮布到容器中時,都會通知該bean,這是典型的觀察者模式。
spring的事件默認是同步的,即調用publishEvent()方法發佈事件後,它會處於阻塞狀態,直到onApplicationEvent接收到事件並處理完返回之後才會繼續往下執行,這種單線程同步的好處是可以進行事務管理。
spring提供的標準事件:
a. ContextRefreshedEvent:當容器被實例化或refreshed時發佈,如調用refresh()方法,此處的實例化是指所有的bean都已被加載,後置處理器被激活,所有單例bean都已被實例化,所有的容器對象都已準備好可使用。如果容器支持熱重載,則refresh可以被觸發多次(XmlWebApplicationContext支持熱刷新,而GenericApplicationContext則不支持);
b. ContextStartedEvent:當容器啟動時發佈,即調用start()方法,已啟用意味著所有的Lifecycle bean都已被顯式接收到了start信號;
c. ContextStopedEvent:當容器停止時發佈,即調用stop()方法,即所有的Lifecycle bean都已顯式接收到了stop()信號,關閉的容器可以通過start()方法重啟;
d. ContextClosedEvent:當容器關閉時發佈,即調用close()方法,關閉意味著所有的單例bean都已被銷燬,關閉的容器不能被重啟或refresh;
e. RequestHandledEvent:這隻在使用spring的DispatcherServlet時有效,當一個請求被處理完成時發佈。
2. Spring的事件(Application Event)為Bean與Bean之間的消息通信提供了支持。當一個Bean處理完一個任務之後,希望另外一個Bean知道並能做出相應的處理,這時我們就需要讓另外一個Bean監聽當前Bean所發送的事件。
Spring的事件需要遵循如下流程:
a. 自定義事件,繼承ApplicationEvent;
b. 定義事件監聽器,實現ApplicationListener;
c. 使用容器發佈事件。
3. 代碼示例
a. 自定義事件:
b. 事件監聽器:
解釋:
i. 實現ApplicationListener接口,並指定監聽的事件類型;
ii. 使用onApplicationEvent方法對消息進行接受處理。
c. 事件發佈類:
解釋:
i. 注入ApplicationContext用來發布事件;
ii. 使用ApplicationContext的publishEvent方法來發布。
d. 配置類:
e. 運行測試:
f. 運行結果:
想獲取完整面試題及答案的同學請點贊、關注並轉發。私信樓主:“Java面試題”獲取完整資料,更有超全spring、jvm、linux、docker等電子書相送。更有整理的200多頁的面試重點知識點,非常全面,需要的私信。
閱讀更多 你一生的故事2333 的文章