当前位置:首页 > 科技  > 软件

Springboot 框架中事件监听和发布机制详细介绍

来源: 责编: 时间:2023-11-02 09:09:10 358观看
导读事件监听和发布是Spring Framework中的一种机制,用于实现松散耦合的组件之间的通信。下面是事件监听和发布的详细过程:事件发布的过程:创建事件对象:首先,您需要创建一个事件类,通常继承自ApplicationEvent。这个事件类用于

事件监听和发布是Spring Framework中的一种机制,用于实现松散耦合的组件之间的通信。下面是事件监听和发布的详细过程:RmE28资讯网——每日最新资讯28at.com

事件发布的过程:RmE28资讯网——每日最新资讯28at.com

  1. 创建事件对象:首先,您需要创建一个事件类,通常继承自ApplicationEvent。这个事件类用于封装事件的相关信息。
  2. 创建事件发布者:您需要创建一个事件发布者(通常是一个Spring Bean),该发布者包含一个注入的ApplicationEventPublisher接口,用于发布事件。
  3. 发布事件:在需要发布事件的地方,事件发布者调用publishEvent()方法,并将创建的事件对象作为参数传递给该方法。Spring容器会负责将事件传递给所有已注册的监听器。
  4. 事件传播:Spring容器会遍历所有已注册的事件监听器,将事件传递给每个监听器。监听器的onApplicationEvent()方法会被调用,处理事件。

事件监听的过程:RmE28资讯网——每日最新资讯28at.com

  1. 创建事件监听器:您需要创建一个或多个事件监听器,这些监听器通常实现ApplicationListener接口。每个监听器负责处理特定类型的事件。
  2. 注册监听器:事件监听器需要在Spring容器中注册,以便Spring知道它们存在。您可以使用@Component注解或配置类中的@Bean注解进行注册。
  3. 事件监听器的初始化:当应用程序启动时,Spring容器会初始化所有注册的监听器。
  4. 等待事件:监听器会一直等待与其关联的事件被发布。当事件被发布时,监听器会被调用以处理事件。
  5. 处理事件:监听器实现的onApplicationEvent()方法会被调用,事件对象会作为参数传递给该方法。监听器可以根据事件的信息执行相应的操作。

Spring Framework中的ApplicationEventPublisher接口用于发布和订阅应用程序事件。事件是一种机制,用于在应用程序中实现松散耦合的组件通信。当某些事件发生时,发布者可以通知所有已注册的监听器,并执行相应的操作。下面是ApplicationEventPublisher的详细用法说明和示例代码:RmE28资讯网——每日最新资讯28at.com

创建自定义事件类:RmE28资讯网——每日最新资讯28at.com

首先,需要创建一个自定义事件类,继承自ApplicationEvent。这个事件类将包含希望在应用程序中发布的事件的信息。RmE28资讯网——每日最新资讯28at.com

import org.springframework.context.ApplicationEvent;public class MyCustomEvent extends ApplicationEvent {    private String message;    public MyCustomEvent(Object source, String message) {        super(source);        this.message = message;    }    public String getMessage() {        return message;    }}

创建事件发布者:RmE28资讯网——每日最新资讯28at.com

事件发布者通常是Spring容器中的一个Bean,它使用ApplicationEventPublisher来发布事件。可以注入ApplicationEventPublisher接口以在需要时发布事件。RmE28资讯网——每日最新资讯28at.com

import org.springframework.context.ApplicationEventPublisher;import org.springframework.stereotype.Component;@Componentpublic class MyEventPublisher {    private final ApplicationEventPublisher eventPublisher;    public MyEventPublisher(ApplicationEventPublisher eventPublisher) {        this.eventPublisher = eventPublisher;    }    public void publishCustomEvent(String message) {        MyCustomEvent customEvent = new MyCustomEvent(this, message);        eventPublisher.publishEvent(customEvent);    }}

创建事件监听器:RmE28资讯网——每日最新资讯28at.com

事件监听器负责处理事件。可以创建一个或多个事件监听器,每个监听器可以处理不同类型的事件。RmE28资讯网——每日最新资讯28at.com

import org.springframework.context.ApplicationListener;import org.springframework.stereotype.Component;@Componentpublic class MyEventListener implements ApplicationListener<MyCustomEvent> {    @Override    public void onApplicationEvent(MyCustomEvent event) {        String message = event.getMessage();        // 处理事件        System.out.println("Received custom event with message: " + message);    }}

使用事件发布者发布事件:RmE28资讯网——每日最新资讯28at.com

在需要发布事件的地方,可以调用事件发布者的方法来触发事件。RmE28资讯网——每日最新资讯28at.com

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplicationpublic class MyApplication {    public static void main(String[] args) {        ConfigurableApplicationContext context = SpringApplication.run(MyApplication.class, args);                MyEventPublisher eventPublisher = context.getBean(MyEventPublisher.class);        eventPublisher.publishCustomEvent("Hello, Spring Boot Events!");    }}

当运行MyApplication时,事件发布者将发布一个自定义事件,然后事件监听器将收到事件并执行相应的操作。RmE28资讯网——每日最新资讯28at.com

也可以创建同步和异步事件监听器,以便在事件发生时执行不同的操作。同步监听器会在事件发布线程中直接执行,而异步监听器则会将事件处理委托给另一个线程池,以实现并发处理。下面是同步和异步事件监听的示例说明:RmE28资讯网——每日最新资讯28at.com

同步事件监听器示例:

import org.springframework.context.ApplicationListener;import org.springframework.stereotype.Component;@Componentpublic class MySyncEventListener implements ApplicationListener<MyCustomEvent> {    @Override    public void onApplicationEvent(MyCustomEvent event) {        String message = event.getMessage();        // 模拟一个长时间运行的操作        try {            Thread.sleep(2000); // 模拟2秒的处理时间        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println("Synchronous Event Listener - Received custom event with message: " + message);    }}

在这个示例中,MySyncEventListener是一个同步事件监听器。它在onApplicationEvent()方法中执行了一个模拟的长时间运行的操作(2秒)。RmE28资讯网——每日最新资讯28at.com

异步事件监听器示例:

要创建异步事件监听器,需要使用@Async注解来标记监听器方法,然后配置一个TaskExecutorbean,以便Spring可以在异步线程池中执行监听器方法。以下是一个示例:RmE28资讯网——每日最新资讯28at.com

import org.springframework.context.ApplicationListener;import org.springframework.scheduling.annotation.Async;import org.springframework.stereotype.Component;@Componentpublic class MyAsyncEventListener implements ApplicationListener<MyCustomEvent> {    @Async    @Override    public void onApplicationEvent(MyCustomEvent event) {        String message = event.getMessage();        // 模拟一个长时间运行的操作        try {            Thread.sleep(2000); // 模拟2秒的处理时间        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println("Asynchronous Event Listener - Received custom event with message: " + message);    }}

在这个示例中,MyAsyncEventListener是一个异步事件监听器。它的onApplicationEvent()方法被标记为@Async,并且在方法内模拟了一个长时间运行的操作。RmE28资讯网——每日最新资讯28at.com

配置异步事件监听:

要配置异步事件监听器,需要执行以下步骤:RmE28资讯网——每日最新资讯28at.com

在Spring Boot应用程序的主类上使用@EnableAsync注解以启用异步支持。RmE28资讯网——每日最新资讯28at.com

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.scheduling.annotation.EnableAsync;@SpringBootApplication@EnableAsyncpublic class MyApplication {    public static void main(String[] args) {        SpringApplication.run(MyApplication.class, args);    }}

在配置类或主类中定义一个TaskExecutor bean,以配置异步线程池。RmE28资讯网——每日最新资讯28at.com

import org.springframework.context.annotation.Bean;import org.springframework.core.task.TaskExecutor;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;@Beanpublic TaskExecutor taskExecutor() {    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();    executor.setCorePoolSize(5); // 设置核心线程数    executor.setMaxPoolSize(10); // 设置最大线程数    executor.setQueueCapacity(25); // 设置队列容量    executor.setThreadNamePrefix("MyAsyncThread-");    executor.initialize();    return executor;}

通过以上配置,MyAsyncEventListener将会在异步线程中处理事件,而不会阻塞主线程。RmE28资讯网——每日最新资讯28at.com

请注意,异步监听器的配置可能因应用程序的需求而有所不同。我们可以根据需要调整线程池的大小和其他参数。RmE28资讯网——每日最新资讯28at.com

示例中完整代码,可以从下面网址获取:RmE28资讯网——每日最新资讯28at.com

https://gitee.com/jlearning/wechatdemo.gitRmE28资讯网——每日最新资讯28at.com

https://github.com/icoderoad/wxdemo.gitRmE28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-16513-0.htmlSpringboot 框架中事件监听和发布机制详细介绍

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 不是吧?这 十个 React UI 组件库你不会还不知道吧?

下一篇: Next.js的崛起:为什么它是现代网站的首选全栈框架

标签:
  • 热门焦点
  • 消息称迪士尼要拍真人版《魔发奇缘》:女主可能也找黑人演员

    8月5日消息,迪士尼确实有点忙,忙着将不少动画改成真人版,继《美人鱼》后,真人版《白雪公主》、《魔发奇缘》也在路上了。据外媒消息称,迪士尼将打造真人版
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • Python异步IO编程的进程/线程通信实现

    这篇文章再讲3种方式,同时讲4中进程间通信的方式一、 Python 中线程间通信的实现方式共享变量共享变量是多个线程可以共同访问的变量。在Python中,可以使用threading模块中的L
  • 2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了&mdash;&mdash;贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 网红炒股不为了赚钱,那就是耍流氓!

    来源:首席商业评论6月26日高调宣布入市,网络名嘴大v胡锡进居然进军了股市。在一次财经媒体峰会上,几个财经圈媒体大佬就&ldquo;胡锡进炒股是否知道认真报道&rdquo;展开讨论。有
  • 华为和江淮汽车合作开发百万元问界MPV?双方回应来了

    8月1日消息,郭明錤今天在社交平台发文称,华为正在和江淮汽车合作,开发售价在100万元的问界MPV,预计在2024年第2季度量产,销量目标为上市首年交付5万辆。
  • 回归OPPO两年,一加赢了销量,输了品牌

    成为OPPO旗下主打性能的先锋品牌后,一加屡创佳绩。今年618期间,一加手机全渠道销量同比增长362%,凭借一加 11、一加 Ace 2、一加 Ace 2V三款爆品,一加
Top