每天一個Java知識點(spring-event)

每天分享一個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. 自定義事件:

每天一個Java知識點(spring-event)

自定義事件類

b. 事件監聽器:

每天一個Java知識點(spring-event)

事件監聽器

解釋:

i. 實現ApplicationListener接口,並指定監聽的事件類型;

ii. 使用onApplicationEvent方法對消息進行接受處理。

c. 事件發佈類:

每天一個Java知識點(spring-event)

事件發佈類

解釋:

i. 注入ApplicationContext用來發布事件;

ii. 使用ApplicationContext的publishEvent方法來發布。

d. 配置類:

每天一個Java知識點(spring-event)

配置類

e. 運行測試:

每天一個Java知識點(spring-event)

運行測試類

f. 運行結果:

每天一個Java知識點(spring-event)

運行結果

想獲取完整面試題及答案的同學請點贊、關注並轉發。私信樓主:“Java面試題”獲取完整資料,更有超全spring、jvm、linux、docker等電子書相送。更有整理的200多頁的面試重點知識點,非常全面,需要的私信。


分享到:


相關文章: