我配置了两个事务管理器
XML配置中的一个
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<aop:config>
<aop:advisor pointcut="execution(* com.myorg.*Service.*(..))" advice-ref="transactionAdvice"/>
</aop:config>
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
</tx:advice>
Java配置中的其他
@Bean("transactionManager")
public DataSourceTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
但当我使用@Transactional注释时,在我看来,即使切点不匹配,也会使用XML中定义的事务管理器。
我希望在执行时使用与AOP中定义的切入点事务管理器相匹配的以及在Java配置中定义的@Transactional annotation事务管理器上使用。
由于某些原因,我无法在@Transactional注释中显式指定事务管理器名称,如@Transactional("transactionManager")。
有什么办法做到这一点吗?
在spring引导中(我想它也应该适用于spring),我执行以下操作让spring知道@Transactional
注释使用的默认事务管理器是什么:
@Configuration
public class CustomTransactionManagementConfiguration implements TransactionManagementConfigurer, ApplicationContextAware {
private ApplicationContext applicationContext;
/**
* @return default transaction manager for rogue {@link Transactional} annotations
*/
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return applicationContext.getBean("myTransactionManagerQualifier", PlatformTransactionManager.class);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}