Java中Spring監(jiān)聽器的多種使用方式
Java的spring事件監(jiān)聽模型還是很好用的。這里主要講監(jiān)聽器的注解的使用方式。
最重要的有倆種注解
| 作用 | 適用場(chǎng)景 | ||
|---|---|---|---|
@EventListener | 標(biāo)記方法為事件監(jiān)聽器 | 通用事件監(jiān)聽,*(非事務(wù)) | |
@TransactionalEventListener | 事務(wù)相關(guān)的事件監(jiān)聽 | 需要事務(wù)綁定的事件(事務(wù)) |
對(duì)于@EventListener,有三個(gè)參數(shù)
value、classes、condition
value和classes主要是指定相關(guān)事件的
condition是最常用的,使用Spring Expression Language (SpEL) 實(shí)現(xiàn)動(dòng)態(tài)過濾。.
SpEL 表達(dá)式可以訪問以下變量:
| 變量名 | 等價(jià)形式 | 說明 |
|---|---|---|
#root.event | event | 當(dāng)前事件對(duì)象 |
#root.args | args | 方法參數(shù)數(shù)組 |
#a0, #p0 | args[0] | 第一個(gè)參數(shù) |
#a1, #p1 | args[1] | 第二個(gè)參數(shù) |
#orderEvent | 參數(shù)名為 orderEvent 的參數(shù) |
也可以動(dòng)態(tài)的注冊(cè)一個(gè)spel函數(shù)
public static boolean calculateLength(int type, String article) {
//通過枚舉解析type
//解析長(zhǎng)度
}講其注入到context中去
static class SpelFunctionRegister implements BeanFactoryAware, ApplicationContextAware {
@Override
public void setBeanFactory(BeanFactory beanFactory)
throws BeansException {
// 注冊(cè)自定義函數(shù)
StandardEvaluationContext context =
((StandardEvaluationContext)
beanFactory.getBean(StandardEvaluationContext.class));
try {
// 注冊(cè)一個(gè)計(jì)算評(píng)論內(nèi)容的函數(shù)
context.registerFunction("calculateLength",
CustomSpELFunctions.class.getDeclaredMethod(
"calculateLength",
Integer.class, String.class));
} catch (NoSuchMethodException e) {
throw new RuntimeException("注冊(cè)SpEL函數(shù)失敗", e);
}
}
}@EventListener(condition =
"#calculatLenth(#event.commentType, #event.article)")
public void handleDiscountOrder(OrderEvent event) {
//符合評(píng)論類型、評(píng)論內(nèi)容
}實(shí)際項(xiàng)目更常用的還是@TransactionalEventListener
它將事件監(jiān)聽與數(shù)據(jù)庫(kù)事務(wù)的生命周期綁定,解決了“何時(shí)觸發(fā)事件處理”這個(gè)關(guān)鍵問題。
退可當(dāng)普通監(jiān)聽器使用,進(jìn)可處理事務(wù)相關(guān)的監(jiān)聽,
定義了四個(gè)參數(shù)
1:phase(重要參數(shù)) :以下四個(gè)策略
public enum TransactionPhase {
// 四個(gè)關(guān)鍵階段
BEFORE_COMMIT, // 事務(wù)提交前
AFTER_COMMIT, // 事務(wù)提交后(默認(rèn))是最常用的
AFTER_ROLLBACK, // 事務(wù)回滾后
AFTER_COMPLETION // 事務(wù)完成后(無論成功失敗)
}2:value() 就是指定監(jiān)聽具體的事件的,含義差不多
3:classes() 就是指定監(jiān)聽具體的事件的,含義差不多
4:condition() 與@EventListenner差不多一個(gè)東西
為什么說@EventListener在實(shí)際項(xiàng)目好像使用的更多一點(diǎn),平時(shí)寫代碼不怎么使用這玩意呢
1:大部分表的update、delete、add肯定都會(huì)用事務(wù)進(jìn)行包裝,而對(duì)于這些增刪改操作又會(huì)涉及到一系列的問題。比如清理緩存、一致性補(bǔ)償、異步編排等等十分常見,將代碼解耦合。對(duì)于實(shí)際項(xiàng)目的一個(gè)接口而言代碼過長(zhǎng)不利于擴(kuò)展、理解以及數(shù)據(jù)的正確性
2:清理多節(jié)點(diǎn)本地緩存也十分常用,對(duì)于多節(jié)點(diǎn)的分布式系統(tǒng)而言,不可能都采用的遠(yuǎn)程緩存來做,必然有很多的本地緩存,或者是本地+遠(yuǎn)程遠(yuǎn)程來做的,如果涉及到緩存數(shù)據(jù)相關(guān)業(yè)務(wù)數(shù)據(jù)的變更,如果我只在當(dāng)前節(jié)點(diǎn)進(jìn)行清理緩存,那么其他節(jié)點(diǎn)就有可能有臟數(shù)據(jù)的問題,如果緩存時(shí)間還長(zhǎng),那線上環(huán)境的影響是很大的。比如清理所有節(jié)點(diǎn)的更新的業(yè)務(wù)緩存數(shù)據(jù)。對(duì)于采用了本地緩存的業(yè)務(wù),在業(yè)務(wù)變更需要進(jìn)行publis事件來清除緩存是最高效的。
到此這篇關(guān)于spring的監(jiān)聽器的幾種使用方式的文章就介紹到這了,更多相關(guān)spring監(jiān)聽器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java Spring 中的監(jiān)聽器Listener詳解與實(shí)戰(zhàn)教程
- SpringBoot使用過濾器、攔截器和監(jiān)聽器的案例代碼(Springboot搭建java項(xiàng)目)
- Spring事件監(jiān)聽器@EventListener與publishEvent的使用
- Springboot中使用攔截器、過濾器、監(jiān)聽器的流程分析
- SpringBoot中的ApplicationListener事件監(jiān)聽器使用詳解
- Spring中的監(jiān)聽器SpringApplicationRunListener詳解
- Springboot使用@WebListener?作為web監(jiān)聽器的過程解析
相關(guān)文章
SpringBoot整合Springsecurity實(shí)現(xiàn)數(shù)據(jù)庫(kù)登錄及權(quán)限控制功能
本教程詳細(xì)介紹了如何使用SpringBoot整合SpringSecurity實(shí)現(xiàn)數(shù)據(jù)庫(kù)登錄和權(quán)限控制,本文分步驟結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-10-10
IDEA進(jìn)程已結(jié)束,退出代碼-1073741819 (0xC0000005)的bug
這篇文章主要介紹了IDEA進(jìn)程已結(jié)束,退出代碼-1073741819 (0xC0000005)的bug,本文通過實(shí)例代碼圖文的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
Java如何根據(jù)key值修改Hashmap中的value值
這篇文章主要介紹了Java如何根據(jù)key值修改Hashmap中的value值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
Java設(shè)計(jì)模式之代理模式詳細(xì)解讀
這篇文章主要介紹了Java設(shè)計(jì)模式的代理模式,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)Java設(shè)計(jì)模式的小伙伴有很大的幫助,感興趣的小伙伴可以參考一下2021-08-08
Spring?請(qǐng)求之傳遞?JSON?數(shù)據(jù)的操作方法
JSON 就是一種數(shù)據(jù)格式,有自己的格式和語法,使用文本表示一個(gè)對(duì)象或數(shù)組的信息,因此 JSON 本質(zhì)是字符串,主要負(fù)責(zé)在不同的語言中數(shù)據(jù)傳遞和交換,這篇文章主要介紹了Spring請(qǐng)求之傳遞JSON數(shù)據(jù)的相關(guān)知識(shí),需要的朋友可以參考下2025-04-04
解決java.lang.IllegalArgumentException異常問題
這篇文章主要介紹了解決java.lang.IllegalArgumentException異常問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
java并發(fā)編程工具類PriorityBlockingQueue優(yōu)先級(jí)隊(duì)列
這篇文章主要為大家介紹了java并發(fā)編程工具類PriorityBlockingQueue優(yōu)先級(jí)隊(duì)列的方法示例應(yīng)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03

