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

Spring事件監(jiān)聽機制ApplicationEvent方式

 更新時間:2023年09月21日 09:02:52   作者:愛琴孩  
這篇文章主要介紹了Spring事件監(jiān)聽機制ApplicationEvent方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

前言

ApplicationEvent 以及 Listener 是Spring為我們提供的一個事件監(jiān)聽、訂閱的實現,內部實現原理是觀察者設計模式,設計初衷也是為了系統(tǒng)業(yè)務邏輯之間的解耦,提高可擴展性以及可維護性。

ApplicationEvent的小demo

ApplicationEvent本身是抽象類,無法直接實例化。一般通過子類繼承ApplicationEvent

public class MyApplicationEvent extends ApplicationEvent {
    private Student student;
    public Student getStudent() {
        return student;
    }
    public void setStudent(Student student) {
        this.student = student;
    }
    public MyApplicationEvent(Object source) {
        super(source);
    }
    public MyApplicationEvent(Object source, Student student) {
        super(source);
        this.student = student;
    }
}

事件定義好之后,我們注冊個事件監(jiān)聽器即可。

實現ApplicationListener接口注冊監(jiān)聽器

@Component
public class MyApplicationListener implements ApplicationListener<MyApplicationEvent> {
    private static final Logger LOGGER = LoggerFactory.getLogger(MyApplicationListener.class);
    @Override
    public void onApplicationEvent(MyApplicationEvent myApplicationEvent) {
        Student student = myApplicationEvent.getStudent();
        LOGGER.info("學生對象是={}", JSONObject.toJSONString(student));
    }
}

通過@EventListener注冊監(jiān)聽器,ApplicationContext.publishEvent 默認是同步操作, 并非發(fā)布后不管的異步操作,發(fā)布事件后需要等 @EventListener 執(zhí)行完。

如果需要開啟異步操作 需要在 @EventListener 上 增加 @Async 注解。

@Component
public class AsyncApplicationListener {
    private static final Logger LOGGER = LoggerFactory.getLogger(AsyncApplicationListener.class);
    @EventListener
    @Async
    public void listener(MyApplicationEvent myApplicationEvent) {
        Student student = myApplicationEvent.getStudent();
        LOGGER.info("通過@EventListener獲取學生對象信息={}", JSONObject.toJSONString(student));
    }
}

通過實現SmartApplicationListener接口注冊監(jiān)聽器

SmartApplicationListener接口繼承了全局監(jiān)聽ApplicationListener,并且泛型對象使用的ApplicationEvent來作為全局監(jiān)聽,可以理解為使用SmartApplicationListener作為監(jiān)聽父接口的實現,監(jiān)聽所有事件發(fā)布。

既然是監(jiān)聽所有的事件發(fā)布,那么SmartApplicationListener接口添加了兩個方法supportsEventType、supportsSourceType來作為區(qū)分是否是我們監(jiān)聽的事件,只有這兩個方法同時返回true時才會執(zhí)行onApplicationEvent方法。

@Component
public class MySmartApplicationListener implements SmartApplicationListener {
    private static final Logger LOGGER = LoggerFactory.getLogger(MySmartApplicationListener.class);
    @Override
    public boolean supportsEventType(Class<? extends ApplicationEvent> aClass) {
        return aClass == MyApplicationEvent.class;
    }
    @Override
    public boolean supportsSourceType(Class<?> sourceType) {
        return sourceType == ApplicationRunnerTest.class;
    }
    @Override
    public int getOrder() {
        return 0;
    }
    @Override
    public void onApplicationEvent(ApplicationEvent applicationEvent) {
        MyApplicationEvent myApplicationEvent = (MyApplicationEvent) applicationEvent;
        LOGGER.info("通過MySmartApplicationListener 獲取學生對象信息={}",
                JSONObject.toJSONString(myApplicationEvent.getStudent()));
    }
}

可以看到除了上面的方法,還提供了一個getOrder方法,這個方法就可以解決執(zhí)行監(jiān)聽的順序問題,return的數值越小證明優(yōu)先級越高,執(zhí)行順序越靠前

發(fā)布事件

在Spring的Bean中,注入ApplicationContext ,通過ApplicationContext 來進行事件發(fā)布

@Autowired
private ApplicationContext applicationContext;
applicationContext.publishEvent(new MyApplicationEvent(this, new Student("愛琴孩", 18)));

運行結果

2023-01-28 10:38:39.696 YYZX_Study 13540 [           main]  INFO c.e.s.s.MySmartApplicationListener          37: 通過MySmartApplicationListener 獲取學生對象信息={"age":18,"name":"愛琴孩"}
2023-01-28 10:38:39.696 YYZX_Study 13540 [           main]  INFO c.e.study.service.MyApplicationListener     22: 學生對象是={"age":18,"name":"愛琴孩"}
2023-01-28 10:38:39.696 YYZX_Study 13540 [tOrderService-1]  INFO c.e.s.service.AsyncApplicationListener      25: 通過@EventListener獲取學生對象信息={"age":18,"name":"愛琴孩"}

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 一次排查@CacheEvict注解失效的經歷及解決

    一次排查@CacheEvict注解失效的經歷及解決

    這篇文章主要介紹了一次排查@CacheEvict注解失效的經歷及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 解決Hibernate4執(zhí)行save()或update()無效問題的方法

    解決Hibernate4執(zhí)行save()或update()無效問題的方法

    這篇文章主要為大家詳細介紹了解決Hibernate4執(zhí)行save()或update()無效問題的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Idea熱加載插件JRebel激活以及使用教程

    Idea熱加載插件JRebel激活以及使用教程

    JRebel是一款JVM插件,它使得Java代碼修改后不用重啟系統(tǒng),立即生效,下面這篇文章主要給大家介紹了關于Idea熱加載插件JRebel激活以及使用的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • Java基于ServletContextListener實現UDP監(jiān)聽

    Java基于ServletContextListener實現UDP監(jiān)聽

    這篇文章主要介紹了Java基于ServletContextListener實現UDP監(jiān)聽,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • JAVA+Hibernate 無限級分類

    JAVA+Hibernate 無限級分類

    主要看menu_id和parent_id這兩個字段。 Eclipse生成的表持久映射:(說明:自己加level屬性,作用:為了記錄種類所在深度)
    2008-07-07
  • 關于mybatis mapper類注入失敗的解決方案

    關于mybatis mapper類注入失敗的解決方案

    這篇文章主要介紹了關于mybatis mapper類注入失敗的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Mybatis基于注解形式的sql語句生成實例代碼

    Mybatis基于注解形式的sql語句生成實例代碼

    這篇文章主要介紹了 Mybatis基于注解形式的sql語句生成實例代碼,需要的朋友可以參考下
    2017-09-09
  • 詳解SpringBoot中添加@ResponseBody注解會發(fā)生什么

    詳解SpringBoot中添加@ResponseBody注解會發(fā)生什么

    這篇文章主要介紹了詳解SpringBoot中添加@ResponseBody注解會發(fā)生什么,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • java隨機字符補充版

    java隨機字符補充版

    今天在zuidaimai看到一個java隨機字符生成demo,正好要用,但發(fā)現不完整,重新整理一下,分享給有需要的朋友
    2014-01-01
  • 如何基于Java實現對象List排序

    如何基于Java實現對象List排序

    這篇文章主要介紹了如何基于Java實現對象List排序,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01

最新評論

望都县| 华亭县| 甘谷县| 花莲县| 当涂县| 金寨县| 白城市| 青田县| 荣昌县| 绍兴市| 双流县| 轮台县| 丽水市| 金堂县| 泰州市| 临夏市| 西盟| 崇义县| 平利县| 乌拉特后旗| 横山县| 车致| 海兴县| 高阳县| 张家川| 黑山县| 新晃| 五家渠市| 丰台区| 昭通市| 昌邑市| 营口市| 嘉黎县| 大姚县| 绩溪县| 甘德县| 永德县| 怀宁县| 霍林郭勒市| 萨迦县| 新安县|