我需要在事务成功或回滚后调用一些方法。我使用as
<bean name="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
<property name="sessionFactory">
<ref local="mysessionFactory"/>
</property>
</bean>
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="mysessionFactory"/>
</property>
</bean>
<tx:annotation-driven transaction-manager="txManager" proxy-target-class="true"/>
应用程序使用一些外部web服务,当内部事务回滚时,这些服务需要“清理”。有没有一种方法可以在不使用声明性事务管理的情况下实现这一点。
>
从Hibernate,您可以扩展 EmptyInterceptor
并覆盖 afterTransactionCompletion()
方法,并在 SessionFactoryBean
或 HibernateTransactionManager
中注册它。
从Spring开始,您可以扩展TransactionSynChronizationAdapter
并在完成()之后覆盖并在适当的时候使用
TransactionSynChronizationManager#ynsterSynChronation()
进行注册。
编辑
使用 Spring Aop 向所有带有 @Transactional 注释的方法添加同步的示例
@Aspect
class TransactionAspect extends TransactionSynchronizationAdapter {
@Before("@annotation(org.springframework.transaction.annotation.Transactional)")
public void registerTransactionSyncrhonization() {
TransactionSynchronizationManager.registerSynchronization(this);
}
@Override
public void afterCompletion(int status) {
// code
}
}
Spring有各种可能感兴趣的类:
http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/transaction/support/TransactionSynchronization.html
http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/transaction/support/TransactionSynchronizationAdapter.html
http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/transaction/support/TransactionSynchronizationManager.html
这里有一些示例代码:
http://azagorneanu.blogspot.co.uk/2013/06/transaction-synchronization-callbacks.html
Spring 4.2中引入的事件处理基础设施使这一过程更加简单。
参见:
https://spring.io/blog/2015/02/11/better-application-events-in-spring-framework-4-2#transaction-绑定事件
另一个流行的改进是能够将事件的侦听器绑定到事务的某个阶段。典型的示例是在事务成功完成时处理事件
@Component
public class MyComponent {
@TransactionalEventListener(condition = "#creationEvent.awesome")
public void handleOrderCreatedEvent(CreationEvent<Order> creationEvent) {
...
}
}
@TransactionalEventListener
是常规@EventListener
,并且还公开了事务阶段,默认值为AFTER_COMMIT。您还可以挂接事务的其他阶段(BEFORE_COMMIT、AFTER_ROLLBACK和AFTER_COMPLETION,这只是AFTER_COMMIT和AFTER_ROLLBACK的别名)。
使用Spring 4:不使用全局方面和配置的最简单/最干净的方法基于我在这里的回答:https://stackoverflow.com/a/43322052/986160
如果在成功提交后需要回调< code>@Transactional方法,只需在方法的开头添加:
@Service
public class OneService {
@Autowired
OneDao dao;
@Transactional
public void a transactionalMethod() {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter(){
public void afterCommit(){
//do stuff right after commit
System.out.println("commit!!!");
}
});
//do db stuff
dao.save();
}
}