从 Spring 4.2 开始,事件的侦听器可以绑定到事务的某个阶段。 典型的示例是在事务成功完成时处理事件。 这样做可以更灵活地使用事件,当当前 transaction 实际上对侦听器很重要。spring-doc.cn

您可以使用注释注册常规事件侦听器。 如果需要将其绑定到事务,请使用 . 执行此操作时,默认情况下,侦听器将绑定到事务的提交阶段。@EventListener@TransactionalEventListenerspring-doc.cn

下一个示例显示了这个概念。假设组件发布 order-created 事件,并且我们想要定义一个侦听器,该侦听器应该只处理该事件一次 已成功提交已发布的事务。以下内容 example 设置这样的事件侦听器:spring-doc.cn

@Component
public class MyComponent {

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

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

该注解公开了一个属性,该属性允许您 自定义侦听器应绑定到的事务阶段。 有效阶段是 , (default), 以及聚合事务完成(无论是提交还是回滚)。@TransactionalEventListenerphaseBEFORE_COMMITAFTER_COMMITAFTER_ROLLBACKAFTER_COMPLETIONspring-doc.cn

如果没有事务正在运行,则根本不会调用侦听器,因为我们无法遵循 必需的语义。但是,您可以通过将 Comments 的属性设置为 来覆盖该行为。fallbackExecutiontruespring-doc.cn

从 6.1 开始,可以处理由 管理的线程绑定事务以及由 管理的反应式事务。 对于前者,可以保证侦听器可以看到当前的线程绑定事务。 由于后者使用 Reactor 上下文而不是线程局部变量,因此事务 context 需要作为事件源包含在已发布的事件实例中。 有关详细信息,请参见 TransactionalEventPublisher javadoc。@TransactionalEventListenerPlatformTransactionManagerReactiveTransactionManagerspring-doc.cn

从 6.1 开始,可以处理由 管理的线程绑定事务以及由 管理的反应式事务。 对于前者,可以保证侦听器可以看到当前的线程绑定事务。 由于后者使用 Reactor 上下文而不是线程局部变量,因此事务 context 需要作为事件源包含在已发布的事件实例中。 有关详细信息,请参见 TransactionalEventPublisher javadoc。@TransactionalEventListenerPlatformTransactionManagerReactiveTransactionManagerspring-doc.cn