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

Spring——事件机制

    Spring中的事件机制是基于观察者模式实现的一种组件间通信机制,用于解耦不同组件,实现松耦合的消息传递,它允许一个组件发送事件,其他组件接收并处理事件,而无需直接依赖彼此。

事件机制的组成

Spring事件机制包含三个核心部分:

  • 事件:继承ApplicationEvent的对象,封装需要传递的数据。Spring4.2+可以省略,任意对象都可以作为事件。
  • 事件发布者:通过ApplicationEventPublisher接口发布事件,通常由spring管理的bean实现。
  • 事件监听器:监听并处理事件的组件,通过@EventListener注解或实现ApplicationListener接口定义。

示例

事件:

    首先自定义一个事件类,去实现ApplicationEvent,该父类没有无参构造:

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

发布者:

    在业务代码内注入ApplicationEventPublisher,通过它去发布事件:

@Autowiredprivate ApplicationEventPublisher applicationEventPublisher;public void enent(){//业务代码//发送事件applicationEventPublisher.publishEvent(new MyEvent(this));}

监听器:

    监听事件类型,两种方式都试一遍:

@Component
public class MyLin implements ApplicationListener<MyEvent> {@Overridepublic void onApplicationEvent(MyEvent event) {System.out.println("监听到事件");}
}
@Component
public class MyLin2 {//注意方法的参数类型是监听的类型@EventListenerpublic void onApplicationEvent(MyEvent event) {System.out.println("监听到事件2");}
}


接下来模拟异步的情况:

异步事件监听器

@Component
public class AsyncEventListener {private static final Logger logger = LoggerFactory.getLogger(AsyncEventListener.class);/*** 异步处理事件 - 不会阻塞主线程*/@Async("taskExecutor")  // 指定使用配置的线程池@EventListenerpublic void handleAsyncEvent(MyEvent event) {logger.info("异步事件处理开始 - 事件: {}", event.getMessage());logger.info("当前线程: {}", Thread.currentThread().getName());try {// 模拟耗时操作Thread.sleep(3000);logger.info("异步事件处理完成: {}", event.getMessage());} catch (InterruptedException e) {Thread.currentThread().interrupt();logger.error("异步事件处理被中断", e);}}/*** 同步处理事件 - 会阻塞主线程*/@EventListenerpublic void handleSyncEvent(MyEvent event) {logger.info("同步事件处理开始 - 事件: {}", event.getMessage());logger.info("当前线程: {}", Thread.currentThread().getName());try {// 模拟耗时操作Thread.sleep(2000);logger.info("同步事件处理完成: {}", event.getMessage());} catch (InterruptedException e) {Thread.currentThread().interrupt();logger.error("同步事件处理被中断", e);}}
}
@SpringBootTest
public class EventTest {@Autowiredprivate BusinessService businessService;@Testpublic void testAsyncEvent() {System.out.println("测试开始 - 主线程: " + Thread.currentThread().getName());long startTime = System.currentTimeMillis();businessService.doBusiness();long endTime = System.currentTimeMillis();System.out.println("业务方法执行时间: " + (endTime - startTime) + "ms");// 给异步事件处理留出时间try {Thread.sleep(5000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}}
}

Spring 内置事件

Spring 框架自带一些内置事件,用于通知容器生命周期的关键节点,常见的有:

事件类型触发时机
ContextRefreshedEventSpring 容器初始化完成(所有 Bean 加载完成)
ContextStartedEvent容器启动时(调用start()方法)
ContextStoppedEvent容器停止时(调用stop()方法)
ContextClosedEvent容器关闭时(调用close()方法)
ApplicationFailedEvent应用启动失败时(Spring Boot 中常用)
http://www.dtcms.com/a/446145.html

相关文章:

  • UMI企业智脑4.0与5.0的先进性之争,从“AI工具”到“孪生数字人”,赋能每个员工
  • 城乡建设查询网站网站维护包括
  • 从国标到自动化:VSTO实现身份证智能解析(待测)
  • 租凭境外服务器做违规网站wordpress 幻灯片主题
  • 网站开发团队简介如何写链接网站制作
  • php 8.4.5 更新日志
  • MongoDB 连接时的**认证参数配置错误**
  • 大兴安岭做网站葫芦岛建设工程信息网站
  • 商标设计网站提供哪些服务建筑书店
  • 除 OpenAI/GPT-4o 等主流头部产品外,值得关注的 AI 及 Agent 产品有哪些?
  • Vue 3 —— M / 接口文档
  • 【办公类-109-06】20250916圆牌卡片15CM手工纸+动物头像+拼音表+word单面编辑
  • 服务器搭建网站制作网站怎么用图片做背景
  • 搭建网站空间无印良品vi设计分析
  • 做pc端网站资讯seo诊断工具有哪些
  • 高层次综合基础-vivado hls第三章
  • 网站建设单位不给数据库苏州网络公司工作室
  • windows部署网站phpwordpress教程网页修改
  • 前端GIS篇——WebGIS、WebGL、Java后端篇
  • 网站开发语言分析网站制作想法
  • 做抽奖网站合法吗网站底部备案代码
  • 基于SGLang的推理服务业务实战部署方案(直接可用)
  • 秦皇岛seo网站推广吉林省吉林市是几线城市
  • [ Spring 框架 ] 数据访问和事务管理
  • 云南建设注册考试中心网站appwordpress域名修改数据库
  • Coze源码分析-资源库-编辑知识库-后端源码-IDL/API层
  • 机器学习周报十六
  • 怎么免费制作企业网站找人做个网站大概多少钱
  • 凡科建站自助建站平台定制手机壳的网站
  • 实战 | 使用 Chrome 开发者工具修改网页源码跳过前端校验