中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring事件監聽機制主要涉及到的核心類和接口有哪些

發布時間:2021-10-13 15:54:14 來源:億速云 閱讀:158 作者:iii 欄目:編程語言

這篇文章主要介紹“Spring事件監聽機制主要涉及到的核心類和接口有哪些”,在日常操作中,相信很多人在Spring事件監聽機制主要涉及到的核心類和接口有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Spring事件監聽機制主要涉及到的核心類和接口有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

Spring 事件監聽機制

其實在 Spring/ Spring Boot 框架中有一套事件監聽機制,可以實現觀察者模式。

Spring/ Spring Boot 框架中也都內置了許多事件,我們也可以自定義發布應用程序事件,下面我們會介紹。

其主要涉及到的幾個核心類和接口如下 :

ApplicationEvent

ApplicationEvent(應用程序事件)它是一個抽象類,相當于觀察者模式中的觀察目標。

ApplicationEvent 源碼如下:

public abstract class ApplicationEvent extends EventObject {     /** use serialVersionUID from Spring 1.2 for interoperability. */     private static final long serialVersionUID = 7099057708183571937L;     /** System time when the event happened. */     private final long timestamp;     /**      * Create a new {@code ApplicationEvent}.      * @param source the object on which the event initially occurred or with      * which the event is associated (never {@code null})      */     public ApplicationEvent(Object source) {        super(source);        this.timestamp = System.currentTimeMillis();     }     /**      * Return the system time in milliseconds when the event occurred.      */     public final long getTimestamp() {        return this.timestamp;     }  }

ApplicationEvent 繼承自 Java 中的 EventObject 事件對象類,Spring 框架中的所有事件都繼承自 ApplicationEvent 類,它是所有事件的父類。

ApplicationEvent 主要的核心是類構造器,它可以初始化一個 source 事件關聯對象,以便在事件監聽器中獲取并通知更新。

ApplicationListener

ApplicationListener(應用程序事件監聽器)它是一個接口,相當于觀察者模式中的觀察者。

ApplicationListener 源碼如下:

public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {     /**      * Handle an application event.      * @param event the event to respond to      */     void onApplicationEvent(E event);  }

ApplicationListener 繼承自 Java 中的 EventListener 事件監聽接口,ApplicationListener 類中只有一個 onApplicationEvent 方法,當指定監聽的事件被發布后就會被觸發執行,可以通過 event 獲取事件中的關聯對象。

ApplicationEventPublisher

應用程序事件發布接口,封裝了事件發布功能的基礎接口。

public interface ApplicationEventPublisher {     /**      * Notify all <strong>matching</strong> listeners registered with this      * application of an application event. Events may be framework events      * (such as ContextRefreshedEvent) or application-specific events.      * <p>Such an event publication step is effectively a hand-off to the      * multicaster and does not imply synchronous/asynchronous execution      * or even immediate execution at all. Event listeners are encouraged      * to be as efficient as possible, individually using asynchronous      * execution for longer-running and potentially blocking operations.      * @param event the event to publish      * @see #publishEvent(Object)      * @see org.springframework.context.event.ContextRefreshedEvent      * @see org.springframework.context.event.ContextClosedEvent      */     default void publishEvent(ApplicationEvent event) {        publishEvent((Object) event);     }     /**      * Notify all <strong>matching</strong> listeners registered with this      * application of an event.     * <p>If the specified {@code event} is not an {@link ApplicationEvent},      * it is wrapped in a {@link PayloadApplicationEvent}.      * <p>Such an event publication step is effectively a hand-off to the      * multicaster and does not imply synchronous/asynchronous execution      * or even immediate execution at all. Event listeners are encouraged      * to be as efficient as possible, individually using asynchronous      * execution for longer-running and potentially blocking operations.      * @param event the event to publish      * @since 4.2      * @see #publishEvent(ApplicationEvent)      * @see PayloadApplicationEvent      */     void publishEvent(Object event);  }

ApplicationEventPublisher 有一個默認接口方法和接口方法,接口方法需要由具體的子類容器實現。

ApplicationContext

ApplicationContext 這個類就再熟悉不過了,它是 Spring 框架中的核心容器。

如下圖所示,ApplicationContext 接口繼承了 ApplicationEventPublisher 接口,所以常用的 ApplicationContext 就可以用來發布事件。

Spring事件監聽機制主要涉及到的核心類和接口有哪些

以上介紹的 Spring 事件監聽發布角色串起來就是,通過 ApplicationEventPublisher 或者 ApplicationContext 容器發布  ApplicationEvent 事件并關聯事件對象,然后 ApplicationListener 監聽該事件,當事件發布后,監聽器就會收執行并獲取到事件及關聯對象。

Spring Boot 觀察者模式實戰

搞懂了 Spring 框架中的事件和監聽機制,那我們還是以上篇中觀察者模式的例子來改造下。

Spring Boot 基礎性的知識和搭建過程就不介紹了,不熟悉的可以關注公眾號Java技術棧,在后臺回復關鍵字 "boot" 閱讀我之前寫的系列教程。

所有 Spring Boot 教程實戰源碼在下面個倉庫:

https://github.com/javastacks/spring-boot-best-practice

新增觀察者目標類 

import lombok.Getter;  import org.springframework.context.ApplicationEvent;  /**   * 觀察目標:棧長   * 來源微信公眾號:Java技術棧   */  @Getter  public class JavaStackEvent extends ApplicationEvent {      /**       * Create a new {@code ApplicationEvent}.       *      * @param source the object on which the event initially occurred or with       *               which the event is associated (never {@code null})       */      public JavaStackEvent(Object source) {          super(source);      }  }

實現 Spring 框架中的 ApplicationEvent 應用程序事件接口,相當于是一個觀察者目標。

新增觀察者類 

import lombok.NonNull;  import lombok.RequiredArgsConstructor;  import org.springframework.context.ApplicationListener;  import org.springframework.scheduling.annotation.Async;  /**   * 觀察者:讀者粉絲   * 來源微信公眾號:Java技術棧   */  @RequiredArgsConstructor  public class ReaderListener implements ApplicationListener<JavaStackEvent> {      @NonNull      private String name;      private String article;     @Async      @Override      public void onApplicationEvent(JavaStackEvent event) {          // 更新文章         updateArticle(event);      }      private void updateArticle(JavaStackEvent event) {          this.article = (String) event.getSource();          System.out.printf("我是讀者:%s,文章已更新為:%s\n", this.name, this.article);      }  }

實現 Spring 框架中的 ApplicationListener 應用監聽接口,相當于是觀察者。

觀察目標和觀察者類結構圖如下:

Spring事件監聽機制主要涉及到的核心類和接口有哪些

新增測試配置類 

import lombok.extern.slf4j.Slf4j;  import org.springframework.boot.CommandLineRunner;  import org.springframework.context.ApplicationContext;  import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;  @Slf4j  @Configuration  public class ObserverConfiguration {      @Bean      public CommandLineRunner commandLineRunner(ApplicationContext context) {          return (args) -> {              log.info("發布事件:什么是觀察者模式?");              context.publishEvent(new JavaStackEvent("什么是觀察者模式?"));          };      }      @Bean      public ReaderListener readerListener1(){          return new ReaderListener("小明");     }      @Bean      public ReaderListener readerListener2(){          return new ReaderListener("小張");      }      @Bean      public ReaderListener readerListener3(){          return new ReaderListener("小愛");     } }

在 Spring 配置中創建了三個讀者 Bean,在 Spring Boot 啟動后發布一個觀察者模式事件,然后這三個 Bean 就會收到通知。

輸出結果:

Spring事件監聽機制主要涉及到的核心類和接口有哪些

這里每個讀者創建一個 Bean 可能不太合適,因為要模仿上一個觀察者模式的應用。

實際中的觀察者模式應用應該是指具體業務,舉例說一個電商支付場景,在用戶支付完后可以發布一個支付事件,然后會有扣減積分,短信通知、贈送優惠券等一系列后續的事件監聽器觀察者,這樣可以實現業務解耦,這是一種很典型的應用場景。

到此,關于“Spring事件監聽機制主要涉及到的核心類和接口有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

四子王旗| 通许县| 连城县| 沙河市| 页游| 奇台县| 彭阳县| 柳州市| 建始县| 呼和浩特市| 五寨县| 广平县| 仁化县| 休宁县| 潼南县| 廉江市| 奈曼旗| 商城县| 金川县| 常熟市| 南漳县| 扎囊县| 兰州市| 临泉县| 南丰县| 苍南县| 泉州市| 繁昌县| 扬中市| 麻阳| 琼中| 富源县| 庆云县| 苏州市| 收藏| 平凉市| 甘孜县| 固始县| 海兴县| 东辽县| 昌都县|