gpt4 book ai didi

java - @EnableTransactionManagement 的范围是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:11:48 25 4
gpt4 key购买 nike

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

考虑以下场景:我在 JPAConfig.java 和 AppConfig.java 中有 JPA 配置和一组服务 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 {
}

感谢任何建议。

最佳答案

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

  • 不需要在每个上配置@EnableTransactionManagement上下文配置的一部分,尽管这很重要注解在注册 internalTransactionAdvisor 时被发现它实际上处理创建的 bean 上的 @Transactional 注释。
  • 在我的例子中,我改变了 @Import 声明中上下文的顺序持有 @EnableTransactionManagementPersistenceConfig 是第一的。在来自其他部分的这个 bean 之后可以使用 AOP 声明交易。
  • 另一个警告涉及同时使用 @EnableTransactionManagement@EnableGlobalMethodSecurity。全局方法安全性使用 bean 后处理,这似乎需要连接整个安全配置。 BeanPostProcessors 是在上下文启动的早期创建的,因此您不能在引导 spring 安全性所需的任何 bean 中使用声明式 @Transactional(在我的例子中是 UserDetailsContextMapper)-那时还没有创建顾问!

关于java - @EnableTransactionManagement 的范围是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25990741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com