@EnableTransactionManagement
是否必须?经过我的研究,有些人认为你不需要它,因为Spring Boot已经默认启用了它,而另一些人则说你必须显式地使用它。那么它到底是怎样的呢?@EnableTransactionManagement
是否必须?经过我的研究,有些人认为你不需要它,因为Spring Boot已经默认启用了它,而另一些人则说你必须显式地使用它。那么它到底是怎样的呢?可能你也在使用Spring Data。调用Spring Data仓库时,默认情况下会被事务包围,即使没有@EnableTransactionManagement
。如果Spring Data发现已经存在的事务,则会重复使用该事务,否则将创建一个新事务。
然而,在你自己的代码中使用@Transactional
注解,只有在激活了@EnableTransactionManagement
(或以其他方式配置了事务处理)时才会被评估。
您可以通过向application.properties
添加以下属性来轻松跟踪事务行为:
logging.level.org.springframework.transaction.interceptor=TRACE
(参见在日志中显示Spring事务)
这篇文章有一点旧,但我在查找它时之前给出的答案并不直接。
@EnableTransactionManagement
在Spring Boot中是可选的,只要在类路径中发现了spring-data*或spring-tx。它是如何工作的?具体如下:
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
在类路径中可用,则会启用。 EnableTransactionManagementConfiguration
也在那里配置。
@EnableAutoConfiguration
是由 @SpringBootApplication
添加的。 - v.ladynev不需要。默认情况下,@EnableTransactionManagement
已启用,请参见:https://github.com/jkubrynski/spring-boot/commit/9d219ef7a004c58a88bbbef82a520a22961c9402
@EnableTransactionManagement根据类路径中添加的依赖项进行有条件的打开/关闭。如果我们使用spring data jpa starter,则会打开它。
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
。
@EnableAutoConfiguration
śėĮÁĒĪ@SpringBootApplication
ś∑ĽŚä†ÁöĄ„Äā - Alex78191