2014-09-23 169 views
6

我想了解在多个JavaConfig上下文的情况下,在哪里放置@EnableTransactionManagement注释的正确位置?@EnableTransactionManagement的范围是什么?

请考虑以下情况:我在JPAConfig.java中配置了JPA配置,在服务bean中配置了AppConfig.java。然后我在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

该注解将事务管理内容添加到整个应用程序上下文中。这是它的范围。 – 2014-09-23 08:53:39

+1

但它似乎并未启用整个RootConfig的事务注释处理。至少,它不适合我。 – 2014-09-23 09:46:49

回答

10

一些实验,我似乎后已经找到自己的答案:

  • 没有必要在每个 一块上下文配置的配置@EnableTransactionManagement虽然它无论多么早在它注册这个 注释发现internalTransactionAdvisor 其实际处理@Transactional在创建的bean上的注释。
  • 在我而言,我改变了上下文的顺序@Import声明,以便 是PersistenceConfig持有@EnableTransactionManagement是 第一。此后,来自其他作品的豆子可以使用AOP声明 交易。
  • 另一个警告涉及同时使用@EnableTransactionManagement@EnableGlobalMethodSecurity。全局方法安全性使用bean后期处理,似乎需要整个安全配置进行连线。 BeanPostProcessors是在上下文启动早期创建的,所以你不能在任何需要引导弹簧安全的bean中使用声明@Transactional(在我的情况下为​​) - 那么顾问还没有创建!
+0

您是如何设法通过spring-security配置获得交易的? – Tarator 2017-09-28 11:50:59

+0

现在已经有一段时间了:)据我所知,我刚刚结束了一个程序化交易。当需要它时,它确实是一个地方,所以这样的解决方案很适合我。 – 2017-10-18 14:39:54