对于最新的稳定版本,请使用 Spring Framework 7.0.6!spring-doc.cadn.net.cn

事务绑定事件

从 Spring 4.2 开始,事件的监听器可以绑定到事务的一个阶段。 典型的例子是在事务成功完成时处理事件。 这样做可以让事件在当前事务的结果实际上对监听器有意义时,具有更大的灵活性。spring-doc.cadn.net.cn

您可以使用 @EventListener 注解来注册一个常规事件监听器。 如果需要将其绑定到事务,请使用 @TransactionalEventListener。 这样,监听器默认会绑定到事务的提交阶段。spring-doc.cadn.net.cn

下一个示例展示了这个概念。假设一个组件发布了订单创建事件,并且我们想要定义一个监听器,该监听器应在发布该事件的事务成功提交后才处理该事件。以下示例设置了这样的事件监听器:spring-doc.cadn.net.cn

@Component
public class MyComponent {

	@TransactionalEventListener
	public void handleOrderCreatedEvent(CreationEvent<Order> creationEvent) {
		// ...
	}
}
@Component
class MyComponent {

	@TransactionalEventListener
	fun handleOrderCreatedEvent(creationEvent: CreationEvent<Order>) {
		// ...
	}
}

@TransactionalEventListener 注解公开了一个 phase 属性,允许你自定义事务的阶段,以便将监听器绑定到该阶段。 有效的阶段包括 BEFORE_COMMITAFTER_COMMIT(默认)、AFTER_ROLLBACK,以及 AFTER_COMPLETION,后者会聚合事务的完成(无论是提交还是回滚)。spring-doc.cadn.net.cn

如果没有运行中的事务,由于无法满足所需的语义,监听器根本不会被调用。但是,您可以通过将注解的 fallbackExecution 属性设置为 true 来覆盖此行为。spring-doc.cadn.net.cn

@TransactionalEventListener 仅适用于由 PlatformTransactionManager 管理的线程绑定事务。由 ReactiveTransactionManager 管理的响应式事务使用 Reactor 上下文而不是线程局部属性,因此从事件监听器的角度来看,没有可以参与的兼容活动事务。spring-doc.cadn.net.cn