Spring 应用程序 - 运行 交易结束方法?

Spring app - run method on end of transaction?

我想知道是否可以配置 spring 以在结束事务时触发特定方法?

例如我有服务 class 方法

@Service
public class service implements IService
{
    @Resource
    private EntityDao entityDao;

    @Resource
    private SomeService someService;

    @Transactional
    @Override
    public void doThings()
    {
       entityDao.doSmthOnDb();
       someService.thisMethodFiresOnEndOfTransaction();
    }

}

和第二个服务class

@Service
public class secondService implements ISecondService
{
  @Resource
  private IService service;

  @Transactional
  @Override
  public void method()
  {
  service.doThings();
  /*
  some other code that can break transaction
  */
  }
}

所以如果我调用 secondService.method() 我希望 someService.thisMethodFiresOnEndOfTransaction() 只有在事务成功结束时才会触发。

spring可以吗?

不确定,当您可以在这些服务之间添加新的 bean 作为间接层并将这个东西委托给它时,将它委托给 spring 是否是个好主意。

但是如果你真的没有选择或者想用Spring来做,你可以指定你自己的PlatformTransactionManager,它会将所有调用委托给默认管理器,但也会成功拦截commit() 来电。 示例:

public class MyTransactionalManager implements PlatformTransactionManager {
// ... implementation via delegation skipped here
    @Override
    public void commit(TransactionStatus status) throws TransactionException {
        defaultManager.commit(status);
        // You might want to check status.isRollbackOnly() here
        someService.thisMethodFiresOnEndOfTransaction();
}

现在您可以替换应用程序中的默认事务管理器(然后 ::thisMethodFiresOnEndOfTransaction 将在 each 事务之后调用)或添加它与一些限定符的上下文,那么你应该写这样的东西:

@Override
@Transactional(value = "myManager", rollbackFor = ...)  
public void method()

(在回答的最后,我仍然认为这是有缺陷的方法,通过另一个 bean 实现它要好得多)