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 实现它要好得多)
我想知道是否可以配置 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 实现它要好得多)