2014-09-23 166 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