3 分鐘快速上手 Spring 事件機(jī)制
小伙伴們好呀~ 今天來(lái)和大家分享下這個(gè) Spring事件機(jī)制
內(nèi)容概覽

原理

這個(gè)熟悉 觀察者模式 的小伙伴應(yīng)該一眼就看出來(lái)啦~
其實(shí)就是個(gè)簡(jiǎn)單版的 發(fā)布-訂閱模式
有三個(gè)核心類??
事件 ApplicationEvent事件發(fā)布器 ApplicationEventPublisher事件監(jiān)聽(tīng)器 ApplicationListener
用途??
事件發(fā)布器發(fā)布事件,監(jiān)聽(tīng)器監(jiān)聽(tīng)到對(duì)應(yīng)的事件后做出相應(yīng)的反應(yīng)~
為什么使用
因?yàn)樾枨笠膊淮_定 ??
場(chǎng)景
領(lǐng)導(dǎo):想在用戶操作完后發(fā)個(gè)郵件通知下A
我:好的
幾天后……
領(lǐng)導(dǎo):算了,先站內(nèi)提醒就好了,后面再考慮發(fā)短信通知啥的,看看哪個(gè)效果好點(diǎn)
我:……好的
一開(kāi)始我也沒(méi)用這個(gè)事件機(jī)制的,沒(méi)多想就寫(xiě)一起了
后面覺(jué)得有點(diǎn)不對(duì)勁,才想起來(lái)用這招的??
優(yōu)點(diǎn)??
解耦 可以將業(yè)務(wù)代碼和發(fā)郵件,站內(nèi)提醒,短信等進(jìn)行分離 異步通知 不用等待這些事件的完成 提高擴(kuò)展性 后面再擴(kuò)展其他操作也方便多啦
提醒
體量小的系統(tǒng)還可以用,大點(diǎn)的還是直接用消息中間件去解決靠譜
項(xiàng)目實(shí)戰(zhàn)

功能
根據(jù)小伙伴反饋事件去發(fā)送短信和郵件
主要源碼
一. 小伙伴反饋事件 ReaderFeedbackEvent

特點(diǎn)和作用??
繼承
ApplicationEvent,保存反饋信息的DTO
二. 事件發(fā)布器 ReaderFeedbackEventPublisher

特點(diǎn)和作用??
實(shí)現(xiàn)
ApplicationEventPublisherAware這個(gè)接口,獲取ApplicationEventPublisher事件發(fā)布器去發(fā)布事件
三. 監(jiān)聽(tīng) ReaderFeedbackEvent 事件并發(fā)送郵件

特點(diǎn)和作用??
實(shí)現(xiàn)
ApplicationListener這個(gè)接口,獲取事件中的反饋信息,并發(fā)送郵件
四. 當(dāng)反饋信息有點(diǎn)贊時(shí)才發(fā)送短信通知??

特點(diǎn)和作用??
監(jiān)聽(tīng)器的第二種寫(xiě)法—— 注解 ,比較方便,這里監(jiān)聽(tīng)并判斷是不是點(diǎn)贊,再去發(fā)送短信??
測(cè)試
這里直接在 IDEA 中進(jìn)行測(cè)試,

效果如下??
like = false

like = true

收到的短信

小結(jié)
可以看到功能模塊很簡(jiǎn)單,監(jiān)聽(tīng)反饋事件,然后去發(fā)送短信和郵件~

這部分代碼上傳到我的
GitHub倉(cāng)庫(kù)啦 (地址在文末)??
Spring源碼解讀
異步/同步
這里我們打個(gè)斷點(diǎn),就可以輕易的來(lái)到這里啦 ??

這個(gè)方法在事件多播器 SimpleApplicationEventMulticaster 中,可以看到當(dāng)有配置這個(gè)線程池時(shí),是走異步通知路線的
那怎么調(diào)用監(jiān)聽(tīng)器的呢?
可以看到就這簡(jiǎn)單3步 ,最后就是回到我們的 onApplicationEvent 方法中去處理的
invokeListener ——> doInvokeListener ——> onApplicationEvent

最后
活學(xué)活用,快去試試叭!??
本期思維導(dǎo)圖如下??

