此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-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_COMMIT,AFTER_COMMIT(默认),AFTER_ROLLBACK,以及AFTER_COMPLETION聚合事务完成(无论是提交还是回滚)。spring-doc.cadn.net.cn

如果没有事务正在运行,则根本不会调用侦听器,因为我们无法接受 必需的语义。但是,您可以通过设置fallbackExecution属性的注释设置为true.spring-doc.cadn.net.cn

从 6.1 开始,@TransactionalEventListener可以处理由PlatformTransactionManager以及由ReactiveTransactionManager. 对于前者,侦听器可以保证看到当前线程绑定的事务。 由于后者使用 Reactor 上下文而不是线程局部变量,因此事务 context 需要作为事件源包含在已发布的事件实例中。 请参阅TransactionalEventPublisherjavadoc 了解详情。spring-doc.cadn.net.cn