在 Spring 引导中是否需要 @EnableTransactionManagement? 我做了些调查。有些人说你不需要它,因为 SpringBoot 已经启用了它,其他人说你必须明确地使用它。感觉怎么样?
@EnableTransactionManagement
也许您还在使用 Spring 数据。对 Spring Data 存储库的调用在默认情况下是由事务包围的,即使没有 @EnableTransactionManagement。如果 SpringData 找到一个现有的事务,那么现有的事务将被重用,否则将创建一个新的事务。
但是,只有在激活了 @EnableTransactionManagement(或以其他方式配置了事务处理)时,才会计算自己代码中的 @Transactional注释。
@Transactional
通过在 application.properties中添加以下属性,您可以轻松地跟踪事务行为:
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条目。这将为您初始化事务自动配置。
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也在那里配置。
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。
spring.aop.proxy-target-class=true
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 启动器它是打开的。