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、模块化开发:不同模块可以独立定义和实现自己的事件监听器,支持模块化开发和组装。