溫馨提示×

溫馨提示×

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

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

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

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

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

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

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

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

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

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 事件關聯(lián)對象,以便在事件監(jiān)聽器中獲取并通知更新。

ApplicationListener

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

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 事件監(jiān)聽接口,ApplicationListener 類中只有一個 onApplicationEvent 方法,當指定監(jiān)聽的事件被發(fā)布后就會被觸發(fā)執(zhí)行,可以通過 event 獲取事件中的關聯(lián)對象。

ApplicationEventPublisher

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

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 有一個默認接口方法和接口方法,接口方法需要由具體的子類容器實現(xiàn)。

ApplicationContext

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

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

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

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

Spring Boot 觀察者模式實戰(zhàn)

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

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

所有 Spring Boot 教程實戰(zhàn)源碼在下面?zhèn)€倉庫:

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);      }  }

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

實現(xiàn) Spring 框架中的 ApplicationListener 應用監(jiān)聽接口,相當于是觀察者。

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

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

新增測試配置類 

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("發(fā)布事件:什么是觀察者模式?");              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 配置中創(chuàng)建了三個讀者 Bean,在 Spring Boot 啟動后發(fā)布一個觀察者模式事件,然后這三個 Bean 就會收到通知。

輸出結果:

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

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

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

到此,關于“Spring事件監(jiān)聽機制主要涉及到的核心類和接口有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

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

AI