場景
java開發中有些邏輯是這樣的,完成了A操做,再繼續B操做,在繼續C操做。這麼描述好像有點不清楚。打個比方把,你吃晚飯,通知你老婆(女朋友)來收碗筷,而後通知你的線上兄弟告訴他們你回來了準備開黑。至於你老婆(女朋友)來不來收拾無所謂,反正你告訴她了。至於你兄弟你也是通知他們,人家也不必定組你,萬一他們正在跟一個一拖三的carry大佬玩的正起勁兒呢。java
事件的概念
吃晚飯就是一個所謂的事件。觸發了隨後的兩個操做,他們只存在因果關係。不存在事務關係。總不能你女朋友不收拾,你回退到吃飯前的狀況吧。因此事件通常適用於沒有事務的操做。若是你真的須要在事件中插入一些事務,該考慮引入一些消息中間件了,好比我以前科普的rabbitmq或者apache 的rocketmq。git
spring中的事件玩法
- 新建一個springboot工程
- 聲明一個事件。經過繼承org.springframework.context.ApplicationEvent 來編寫事件。時間裏定義好事件推送到監聽器須要執行的方法,固然也能夠在監聽器裏寫觸發邏輯。
- 事件發佈器。發佈事件經過實現 事件發佈接口org.springframework.context.ApplicationEventPublisher 或者其門面接口org.springframework.context.ApplicationEventPublisherAware, 推薦門面接口,裏面要定義一個主動推送事件的方法以下圖的 refreshEvent方法,實際代理了 ApplicationEventPublisher 執行其publishEvent 方法
- 事件監聽,經過實現 org.springframework.context.ApplicationListener<E extends ApplicationEvent> 來實現事件的監聽。特別注意泛型E,若是不指定事件將能夠接收任何事件,儘可能職責單一
- 將上面三個類注入spring 容器中,這裏咱們採用了 javaConfig方式,看起來更明顯
這裏就大功告成了,那麼如何使用呢,執行事件發佈器的發佈方法refreshEvent就好了 ,咱們來寫一個單元測試spring
運行一下,入圖apache
到此你應該就學會使用spring事件了,這樣寫出來的代碼逼格更高。還能提現你對spring的一些理解。相關代碼在個人碼雲倉庫:https://gitee.com/felord/event-spring.gitspringboot