最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中Spring監(jiān)聽器的多種使用方式

 更新時(shí)間:2025年12月23日 15:39:34   作者:尤物程序猿  
文章介紹了Spring事件監(jiān)聽模型中的注解使用方式,重點(diǎn)講解了@EventListener和@TransactionalEventListener的使用場(chǎng)景和參數(shù),文章還提到在實(shí)際項(xiàng)目中,由于需要處理事務(wù)和緩存問題,感興趣的朋友跟隨小編一起看看吧

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.eventevent當(dāng)前事件對(duì)象
#root.argsargs方法參數(shù)數(shù)組
#a0#p0args[0]第一個(gè)參數(shù)
#a1#p1args[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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

揭东县| 万盛区| 龙山县| 余庆县| 岳普湖县| 铁岭市| 乌拉特前旗| 留坝县| 绥德县| 平江县| 三原县| 汉阴县| 礼泉县| 上林县| 明光市| 镇江市| 阜康市| 来凤县| 台安县| 昂仁县| 老河口市| 西平县| 遂昌县| 平乡县| 遂溪县| 侯马市| 临湘市| 衡山县| 朔州市| 汕头市| 陵川县| 寿宁县| 台南县| 宜昌市| 贵阳市| 三江| 得荣县| 无锡市| 龙山县| 旬邑县| 应用必备|