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

你可能感兴趣的:(Spring,spring,spring事件)