一尘不染

@EnableTransactionManagement的范围是什么?

java

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

考虑以下情形:我在JPAConfig.java和AppConfig.java中具有服务bean集的JPA配置。然后,在RootConfig.java中编写整个应用程序配置。

我在JPAConfig.java中定义事务管理器,并启用对JPA存储库的扫描-
当这些暴露事务行为时,我将其放到@EnableTransactionManagementJPAConfig上,并且它可以工作。

但是,某些服务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 {
}

感谢任何建议。


阅读 460

收藏
2020-12-03

共1个答案

一尘不染

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

  • @EnableTransactionManagement尽管在注册internalTransactionAdvisor 实际处理@Transactional创建的bean上的注释的注册时发现该注释有多早,但这并不需要对每个上下文配置进行配置。
  • 就我而言,我改变了上下文的顺序@Import声明,使PersistenceConfig持有@EnableTransactionManagement是第一。此后其他bean可以使用AOP声明式事务。
  • 另一个警告与同时使用@EnableTransactionManagement和有关@EnableGlobalMethodSecurity。全局方法安全性使用bean后处理,这似乎需要连接整个安全性配置。BeanPostProcessors是在上下文启动时就创建的,因此您不能@Transactional在引导Spring安全性所需的任何bean中使用声明式(在我的情况下UserDetailsContextMapper)-那时还没有创建Advisor!
2020-12-03