@ EnableTransactionManagement in Spring Boot

在 Spring 引导中是否需要 @EnableTransactionManagement? 我做了些调查。有些人说你不需要它,因为 SpringBoot 已经启用了它,其他人说你必须明确地使用它。感觉怎么样?

111456 次浏览

也许您还在使用 Spring 数据。对 Spring Data 存储库的调用在默认情况下是由事务包围的,即使没有 @EnableTransactionManagement。如果 SpringData 找到一个现有的事务,那么现有的事务将被重用,否则将创建一个新的事务。

但是,只有在激活了 @EnableTransactionManagement(或以其他方式配置了事务处理)时,才会计算自己代码中的 @Transactional注释。

通过在 application.properties中添加以下属性,您可以轻松地跟踪事务行为:

logging.level.org.springframework.transaction.interceptor=TRACE

(见 在日志中显示 Spring 事务)

根据 > https://spring.io/guides/gs/managing-transactions/

Spring Boot 将 在类路径和 h2上检测 Spring-jdbc,并将 自动为您创建 DataSource 和 JdbcTemplate。因为这样的基础设施现在已经可用,并且您没有专用的配置,所以 还将为您创建 DataSourceTransactionManager: 这是拦截@Transactional 注释方法的组件。

您还可以使用 弹簧-启动器-启动器-驱动器列出在您的上下文中创建的 bean,您将找到它

Bean”: “ transactionManager”

小老职位,但以前给出的答案并不直接时,我正在寻找它。

在 Spring 引导中,如果在类路径中找到 Spring-data * Spring-tx,则 @EnableTransactionManagement可以选择。它是如何工作的?如下:

Spring 启动在类路径中添加了一个 Spring-boot-autoconfigure.jar 。转到 META-INF 的 spring.Factory 文件,您可以在那里看到 org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration条目。这将为您初始化事务自动配置。

请注意,该类有以下几行: (代码片段)

@Configuration
@ConditionalOnClass({PlatformTransactionManager.class})
@AutoConfigureAfter({JtaAutoConfiguration.class, HibernateJpaAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, Neo4jDataAutoConfiguration.class})
@EnableConfigurationProperties({TransactionProperties.class})
public class TransactionAutoConfiguration {
..
}

查看一下 TransactionAutoConfiguration,如果类路径中有 PlatformTransactionManager,那么它将启用事务支持。EnableTransactionManagementConfiguration也在那里配置。

org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration类中,有这样的代码(Spring Boot 1.5 +) :

    @Configuration
@EnableTransactionManagement(proxyTargetClass = false)
@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "false", matchIfMissing = false)
public static class JdkDynamicAutoProxyConfiguration {


}


@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true", matchIfMissing = true)
public static class CglibAutoProxyConfiguration {


}

默认值是 spring.aop.proxy-target-class=true,默认情况下启用 CGLIB 代理。 如果希望使用 JDK 代理,则改为设置 spring.aop.proxy-target-class=false

在默认情况下,@EnableTransactionManagement处于打开状态,请参见: (a href = “ https://github.com/jkubrynski/spring-boot/commit/9d219ef7a004c58a88bbbef82a520a22961c9402”rel = “ norefrer”> https://github.com/jkubrynski/spring-boot/commit/9d219ef7a004c58a88bbbef82a520a22961c9402

@ EnableTransactionManagement 基于我们在类路径中添加的依赖项 jar 有条件地打开/关闭。如果我们使用弹簧数据 jpa 启动器它是打开的。