@EnableTransactionManagement的范围是什么?

时间:2014-09-23 08:49:51

标签: java spring jpa spring-transactions

我试图了解在多个JavaConfig上下文中放置@EnableTransactionManagement注释的正确位置在哪里?

请考虑以下场景:我在JPAConfig.java中有JPA配置,在AppConfig.java中有一组服务bean。然后我在RootConfig.java中编写整个应用程序配置。

我在JPAConfig.java中定义了事务管理器,并启用了对JPA存储库的扫描 - 因为那些公开了事务行为,我把@EnableTransactionManagement放在JPAConfig上并且它可以工作。

但是,某些服务bean还需要具有事务方法,例如在单个事务中访问多个存储库。我是否也应该将@EnableTransactionManagement放在AppConfig上?在我看来,这种注释的实现看起来会导致某些bean的重新定义。实际上这样做对我来说似乎不起作用。

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories("com.mypackage.repositories")
public class JPAConfig {
 // ... here are EntityManager and PlatformTransactionManager beans
}


@Configuration
@ComponentScan("com.mypackage.services")
// @EnableTransactionManagement // - ???
public class AppConfig {
}

@Configuration
@Import({AppConfig.class, JPAConfig.class})
public class RootConfig {
}

感谢任何建议。

1 个答案:

答案 0 :(得分:11)

经过一些实验,我似乎自己找到了答案:

  • 无需在每个上配置@EnableTransactionManagement 一段上下文配置,尽管这有多早就确实很重要 注册internalTransactionAdvisor时会发现注释 实际上在创建的bean上处理@Transactional注释。
  • 就我而言,我在@Import声明中更改了上下文的顺序 持有PersistenceConfig的{​​{1}}是。{ 第一。在此之后,来自其他部分的bean可以使用AOP声明 事务。
  • 另一个警告涉及同时使用@EnableTransactionManagement@EnableTransactionManagement。全局方法安全性使用bean后处理,这似乎需要连接整个安全配置。 BeanPostProcessors是在上下文启动时尽早创建的,因此您不能在引导spring安全性所需的任何bean中使用声明性@EnableGlobalMethodSecurity(在我的情况下为@Transactional) - 那么还没有创建顾问程序!