欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

ApplicationEvent 以及 Listener 是Spring為我們提供的一個事件監(jiān)聽、訂閱的實現(xiàn),內部實現(xià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)聽器即可。

實現(xià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));
    }
}

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

SmartApplicationListener接口繼承了全局監(jiān)聽ApplicationListener,并且泛型對象使用的ApplicationEvent來作為全局監(jiān)聽,可以理解為使用SmartApplicationListener作為監(jiān)聽父接口的實現(xià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的數(shù)值越小證明優(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":"愛琴孩"}

總結

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

相關文章

  • Java日常練習題,每天進步一點點(54)

    Java日常練習題,每天進步一點點(54)

    下面小編就為大家?guī)硪黄狫ava基礎的幾道練習題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-08-08
  • Springboot集成Springbrick實現(xiàn)動態(tài)插件的步驟詳解

    Springboot集成Springbrick實現(xiàn)動態(tài)插件的步驟詳解

    這篇文章主要介紹了Springboot集成Springbrick實現(xiàn)動態(tài)插件的詳細過程,文中的流程通過代碼示例介紹的非常詳細,感興趣的同學可以參考一下
    2023-06-06
  • JAVA JVM面試題總結

    JAVA JVM面試題總結

    JVM 可以屏蔽與具體操作系統(tǒng)平臺相關的信息,使 Java 程序只需生成在 Java 虛擬機上運行的目標代碼,就可以在不同的平臺上運行。這篇文章主要介紹了JAVA JVM面試題總結,大家可以參考一下
    2021-08-08
  • java抽象類和接口定義與用法詳解

    java抽象類和接口定義與用法詳解

    這篇文章主要介紹了java抽象類和接口定義與用法,結合實例形式詳細分析了java抽象類和接口的基本概念、原理、定義、使用方法及操作注意事項,需要的朋友可以參考下
    2020-02-02
  • 面試官:詳細談談Java對象的4種引用方式

    面試官:詳細談談Java對象的4種引用方式

    這篇文章主要給大家介紹了java面試官常會問到的,關于Java對象的4種引用方式的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Java具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • java操作xml的方法匯總及解析

    java操作xml的方法匯總及解析

    這篇文章主要介紹了java操作xml的方法匯總及解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • 如何在Maven項目配置pom.xml指定JDK版本和編碼

    如何在Maven項目配置pom.xml指定JDK版本和編碼

    maven是個項目管理工具,如果我們不告訴它要使用什么樣的jdk版本編譯,它就會用maven-compiler-plugin默認的jdk版本來處理,這樣就容易出現(xiàn)版本不匹配的問題,這篇文章主要給大家介紹了關于如何在Maven項目配置pom.xml指定JDK版本和編碼的相關資料,需要的朋友可以參考下
    2024-01-01
  • 基于java中正則操作的方法總結

    基于java中正則操作的方法總結

    本篇文章介紹了,在java中正則操作的方法總結。需要的朋友參考下
    2013-05-05
  • java單鏈表逆序用法代碼示例

    java單鏈表逆序用法代碼示例

    這篇文章主要介紹了java單鏈表逆序用法代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Java?spring?通過注解方式創(chuàng)建對象的示例詳解

    Java?spring?通過注解方式創(chuàng)建對象的示例詳解

    這篇文章主要介紹了java?spring?通過注解方式創(chuàng)建對象,本文結合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02

最新評論