浅析 spring 事件驱动

1、ApplicationContext.publishEvent 同步还是异步,为什么 ?

先说结论:默认情况下同步的,即事件发布者会阻塞等待事件处理完成。这是因为Spring的设计初衷是为了保证事件的有序处理和事务的一致性。

看下代码实现:

public void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) {
		ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));
		Executor executor = getTaskExecutor();
		for (ApplicationListener<?> listener : getApplicationListeners(event, type)) {
			if (executor != null) {
				executor.execute(() -> invokeListener(listener, event));
			}
			else {
				invokeListener(listener, event);
			}
		}
}

getTaskExecutor() 默认:org.springframework.core.task.SyncTaskExecutor 

事件发布时遍历所有注册的监听器,调用每个监听器onApplicationEvent 方法进行事件处理

同步怎么改成异步呢?

配置异步任务执行器(AsyncTaskExecutor),将 ApplicationListener 方法执行改为异步执行

@Async // 声明异步执行
    @Override
    public void onApplicationEvent(CustomEvent event) {
        // 异步处理事件
    }
事件驱动带来的好处是什么?

1、松耦合:组件之间的通信通过事件进行,减少了直接依赖关系,提高了系统的灵活性和可扩展性。

2、可扩展性:通过定义事件和监听器接口,可以方便地添加新的事件和监听器,扩展系统的功能。

3、可维护性:事件驱动机制使代码的逻辑结构更清晰,易于理解和维护。

4、模块化开发:不同模块可以独立定义和实现自己的事件监听器,支持模块化开发和组装。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值