Spring Boot需要@EnableTransactionManagement吗? 我做了一些研究。有些人说你不需要它,因为Spring Boot已经启用它,其他人说你必须明确地使用它。那怎么回事?
答案 0 :(得分:40)
您可能也在使用Spring Data。默认情况下,对Spring Data存储库的调用由事务包围,即使没有@EnableTransactionManagement也是如此。如果Spring Data找到现有事务,则将重用现有事务,否则将创建新事务。
但是,只有在激活@EnableTransactionManagement(或以其他方式配置事务处理)时才会评估您自己代码中的@Transactional注释。您可以通过将以下属性添加到application.properties来轻松跟踪事务行为:
logging.level.org.springframework.transaction.interceptor=TRACE
答案 1 :(得分:24)
根据> https://spring.io/guides/gs/managing-transactions/
Spring Boot将检测类路径和h2上的spring-jdbc,并自动为您创建一个DataSource和一个JdbcTemplate 。由于此类基础结构现在可用且您没有专用配置,因此还将为您创建 DataSourceTransactionManager :这是拦截@Transactional注释方法的组件。
您还可以使用 spring-boot-starter-actuator 列出在您的上下文中创建的bean,您将找到它
bean":" transactionManager"
答案 2 :(得分:7)
很老的帖子,但是当我搜索时,先前给出的答案并不是直截了当的。
如果在类路径中找到 spring-data * 或 spring-tx ,则在Spring启动时 @EnableTransactionManagement
可选。这个怎么运作?如下:
Spring boot在类路径中添加 spring-boot-autoconfigure.jar 。转到META-INF的spring.factories文件,您可以在那里看到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
以查看它是否支持transacton支持。 EnableTransactionManagementConfiguration
也在那里配置。
答案 3 :(得分:2)
@EnableTransactionManagement
默认为启用,请注意:https://github.com/jkubrynski/spring-boot/commit/9d219ef7a004c58a88bbbef82a520a22961c9402
答案 4 :(得分:0)
在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
。
答案 5 :(得分:0)
@EnableTransactionManagement。如果我们使用spring data jpa启动器,则会将其打开。