我试图了解在多个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 {
}
感谢任何建议。
答案 0 :(得分:11)
经过一些实验,我似乎自己找到了答案:
@EnableTransactionManagement
一段上下文配置,尽管这有多早就确实很重要
注册internalTransactionAdvisor
时会发现注释
实际上在创建的bean上处理@Transactional
注释。@Import
声明中更改了上下文的顺序
持有PersistenceConfig
的{{1}}是。{
第一。在此之后,来自其他部分的bean可以使用AOP声明
事务。@EnableTransactionManagement
和@EnableTransactionManagement
。全局方法安全性使用bean后处理,这似乎需要连接整个安全配置。 BeanPostProcessors是在上下文启动时尽早创建的,因此您不能在引导spring安全性所需的任何bean中使用声明性@EnableGlobalMethodSecurity
(在我的情况下为@Transactional
) - 那么还没有创建顾问程序!