日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

在開發工作中,會遇到一種場景,做完某一件事情以后,需要廣播一些消息或者通知,告訴其他的模塊進行一些事件處理,一般來說,可以一個一個發送請求去通知,但是有一種更好的方式,那就是事件監聽,事件監聽也是設計模式中 發布-訂閱模式、觀察者模式的一種實現。

觀察者模式:簡單的來講就是你在做事情的時候身邊有人在盯著你,當你做的某一件事情是旁邊觀察的人感興趣的事情的時候,他會根據這個事情做一些其他的事,但是盯著你看的人必須要到你這里來登記,否則你無法通知到他(或者說他沒有資格來盯著你做事情)。

 

對于 Spring 容器的一些事件,可以監聽并且觸發相應的方法。通常的方法有 2 種,ApplicationListener 接口和@EventListener注解

要想順利地創建監聽器,并起作用,這個過程中需要這樣幾個角色:

1、事件(event)可以封裝和傳遞監聽器中要處理的參數,如對象或字符串,并作為監聽器中監聽的目標。

2、監聽器(listener)具體根據事件發生的業務處理模塊,這里可以接收處理事件中封裝的對象或字符串。

3、事件發布者(publisher)事件發生的觸發者。

 

一、ApplicationListener 接口

ApplicationListener 接口的定義如下:

SpringBoot事件監聽:應用監聽接口的使用

 

@FunctionalInterface

public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {

 

/**

* Handle an application event.

* @param event the event to respond to

*/

void onApplicationEvent(E event);

}

它是一個泛型接口,泛型的類型必須是 ApplicationEvent 及其子類,只要實現了這個接口,那么當容器有相應的事件觸發時,就能觸發 onApplicationEvent 方法。ApplicationEvent 類的子類有很多,Spring 框架自帶的如下幾個。

SpringBoot事件監聽:應用監聽接口的使用

 



專欄
Kafka v2.3 快速入門與實踐
作者:軟件架構
29.8幣
73人已購
查看

二、實現一個ApplicationListener接口

使用方法很簡單,就是實現一個 ApplicationListener 接口,并且將加入到容器中就行。

@Component

public class MyApplicationListener implements ApplicationListener<ApplicationEvent> {

@Override

public void onApplicationEvent(ApplicationEvent applicationEvent) {

System.out.println("事件觸發:" + applicationEvent.getClass().getName());

}

}

下面是Spring Boot 項目的啟動類:

@SpringBootApplication

public class SpringEventExampleApplication {

 

public static void main(String[] args) {

SpringApplication.run(SpringEventExampleApplication.class, args);

}

}

可以參考下面的示例項目:

SpringBoot事件監聽:應用監聽接口的使用

 

運行上述的Spring Boot項目,會觸發Spring 默認的一些事件,可以看到Console控制臺輸出:

SpringBoot事件監聽:應用監聽接口的使用

 

三、自定義事件和監聽

下面實現自定義事件,并進行監聽處理。示例項目的包結構如下所示,參考DDD領域模型的包結構。

SpringBoot事件監聽:應用監聽接口的使用

 

(1)自定義事件

首先,我們需要定義一個時間(MyTestEvent),需要繼承Spring的ApplicationEvent。

@Data

public class MyTestEvent extends ApplicationEvent {

private String message;

public MyTestEvent(Object source, String message) {

super(source);

this.message = message;

}

}

其中使用到了lombok提供的@Data注解。

 

(2)定義監聽器

需要定義一下監聽器,自己定義的監聽器需要實現ApplicationListener接口,同時泛型參數要加上自己要監聽的事件Class名,在重寫的方法onApplicationEvent中,添加自己的業務處理邏輯:

@Component

public class MyEventListener implements ApplicationListener<MyTestEvent> {

 

@Override

public void onApplicationEvent(MyTestEvent myTestEvent) {

System.out.println("自定義事件監聽:" + myTestEvent.getMessage());

}

}

 

(3)事件發布

有了事件,有了事件監聽者,那么什么時候觸發這個事件呢?每次想讓監聽器收到事件通知的時候,就可以調用一下事件發布的操作。首先在類里自動注入了ApplicationEventPublisher,這個也就是我們的ApplicationContext,它實現了這個接口。

@Component

public class MyTestEventPublisher {

@Autowired

private ApplicationEventPublisher applicationEventPublisher;

 

// 發布事件

public void publishEvent(String message) {

applicationEventPublisher.publishEvent(new MyTestEvent(this, message));

}

}

 

四、測試自定義事件和監聽

創建一個RestController,可以從外部發起Request請求,觸發自定義事件。

@RestController

public class TestEventController {

@Autowired

private MyTestEventPublisher publisher;

 

@GetMapping("/publish")

public void publishEvent() {

publisher.publishEvent("Hello world.");

}

}

啟動示例項目,通過Postman發起Request請求:localhost:8080/publish

SpringBoot事件監聽:應用監聽接口的使用

 

可以在控制臺看到輸出信息,如圖所示,監聽到MyTestEvent事件,打印輸出事件內容。

SpringBoot事件監聽:應用監聽接口的使用

分享到:
標簽:SpringBoot
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定