当前位置: 首页 > news >正文

Spring的事件监听机制(一)

         先看一段问题代码。如果我们要实现一个主线业务,同时需要做一些支线任务。如果都写在一起,会不太好,我们不希望把主线任务耦合到支线任务里面。

package com.example.springdemo.demos.a17;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;/*** @author zhou* @version 1.0* @description TODO* @date 2025/9/6 21:56*/
@Configuration
public class TestListener {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TestListener.class);context.getBean(MyService.class).doBusiness();context.close();}@Componentstatic class MyService{private static final Logger log = LoggerFactory.getLogger(TestListener.class);public void doBusiness(){log.debug("主线业务");log.debug("发送短信");log.debug("发送邮件");}}
}

        Spring提供了事件监听机制去实现主线任务与支线任务的低耦合。实现思路如下:

1.首先需要提供事件对象

    static class MyEvent extends ApplicationEvent{public MyEvent(Object source) {super(source);}}

2.实现Spring提供的事件监听器接口,并指定泛型接口是我们自己写的事件对象。重写里面的方法加上我们自己的逻辑。

    @Componentstatic class SmsApplicationListener implements ApplicationListener<MyEvent>{private static final Logger log = LoggerFactory.getLogger(SmsApplicationListener.class);@Overridepublic void onApplicationEvent(MyEvent event) {log.debug("发送短信");}}
    @Componentstatic class EmailApplicationListener implements ApplicationListener<MyEvent>{private static final Logger log = LoggerFactory.getLogger(EmailApplicationListener.class);@Overridepublic void onApplicationEvent(MyEvent event) {log.debug("发送邮件");}}

3.改造业务代码

   注入事件发布器发布事件。

    @Componentstatic class MyService{private static final Logger log = LoggerFactory.getLogger(TestListener.class);@Autowiredprivate ApplicationEventPublisher publisher;public void doBusiness(){log.debug("主线业务");/* log.debug("发送短信");log.debug("发送邮件");*/publisher.publishEvent(new MyEvent("MyService.doBusiness()"));}}

   其中MyEvent 构造函数的参数可以是任何有助于监听器理解"发生了什么"和"需要处理什么"的信息,而不仅仅是方法名。

 

打印结果:

           这里监听器执行支线任务是随机的,而且都是在主线程执行,还有优化空间。


文章转载自:

http://gWWpjgbw.rkdhh.cn
http://NGSrrglQ.rkdhh.cn
http://8PM1Y3Pv.rkdhh.cn
http://hFbc24hA.rkdhh.cn
http://j2qCijbT.rkdhh.cn
http://npnx84FE.rkdhh.cn
http://HZCT4RB7.rkdhh.cn
http://B29loG2o.rkdhh.cn
http://C5i08uqW.rkdhh.cn
http://bXQhm2FB.rkdhh.cn
http://OYTST4vR.rkdhh.cn
http://wd4E2VlJ.rkdhh.cn
http://Jnm4Zghg.rkdhh.cn
http://Bdfdvan2.rkdhh.cn
http://OByUYbnQ.rkdhh.cn
http://cwju25Mt.rkdhh.cn
http://5iu2RuHk.rkdhh.cn
http://3tUzlT4T.rkdhh.cn
http://cC7a1Xbr.rkdhh.cn
http://26WTaFzl.rkdhh.cn
http://DX45xbSf.rkdhh.cn
http://TGvWB2uW.rkdhh.cn
http://sdiA50ba.rkdhh.cn
http://fE2Tt3ZL.rkdhh.cn
http://UA45t5Dd.rkdhh.cn
http://Kb5OW8ay.rkdhh.cn
http://o7d5RQlj.rkdhh.cn
http://GsPN67qV.rkdhh.cn
http://i6g3dfs4.rkdhh.cn
http://DrRZvizq.rkdhh.cn
http://www.dtcms.com/a/370820.html

相关文章:

  • 【鸿蒙 NEXT】V1迁移V2状态管理
  • FRCNet
  • git 冲突,Merge
  • NAND Flash块擦除与数据状态解析
  • 分享一个基于Python+大数据的房地产一手房成交数据关联分析与可视化系统,基于机器学习的深圳房产价格走势分析与预测系统
  • 超文本的定义
  • LeetCode 2461.长度为K子数组中的最大和
  • 【机器学习入门】6.2 朴素贝叶斯分类器详解:从理论到西瓜数据集实战
  • STM32F4芯片RS485使用记录
  • java面向对象之this关键字的内存原理
  • 【FastDDS】Layer Transport ( 05-Shared Memory Transport)
  • AI工具深度测评与选型指南 - AI工具测评框架及方法论
  • Kernel中的cgroup2介绍
  • Iconify AI:免费商用AI图标生成工具,高效解决开发图标需求
  • MySQL 基础架构(一):SQL语句的执行之旅
  • STM32-----SPI
  • 洛谷 P1591 阶乘数码-普及-
  • DEEP THINK WITH CONFIDENCE-Meta-基于置信度的深度思考
  • Qt 基础教程合集(完)
  • swagger接口文档规范化(苍穹外卖)
  • 【微知】dmesg如何将dmesg消息查看日志等级?(dmesg -x; prefix)
  • 基于STM32智能阳台监控系统
  • Ubuntu 22.04.1上安装MySQL 8.0及设置root密码
  • 【混元AIGC+腾讯云智能体+首创Coze核心流思维导图MCP】:打造一个文思通-智能写作助手Agent
  • B.50.10.09-RPC核心原理与电商应用
  • C语言字符函数和字符串函数(2)
  • 基于STM32的智慧民宿环境监测系统设计
  • 从 JDK 1.8 切换到 JDK 21 时遇到 NoProviderFoundException 该如何解决?
  • [bat-cli] 打印机 | `src/printer.rs`
  • RLPR: EXTRAPOLATING RLVR TO GENERAL DOMAINS WITHOUT VERIFIERS