gpt4 book ai didi

spring - @Transactional与静态方法

转载 作者:行者123 更新时间:2023-12-04 07:41:22 31 4
gpt4 key购买 nike

为什么我们不能将@Transactional用于静态方法来管理spring项目中的事务?
@Transactional适用于非静态方法,但不适用于任何特定原因的静态方法?

最佳答案

为了理解为什么类似您所提议的东西行不通,您必须首先从高层次上了解Spring如何处理使用@Transactional的bean。

当将方法或类注释为@Transactional并使其成为Spring Bean时,Spring会有效地创建该类的代理(使用JDK动态代理或CGLIB代理)。这意味着每当使用您的类时(即从Spring托管代码中),不是立即调用您的代码,而是首先执行所需操作的代理,然后才调用您的代码(在缓存支持的情况下,代码甚至根本不会被调用)。
这里要记住的关键一点是,调用代码(如果需要的话,调用站点)根本不会改变,并且所需的目标方法(代理方法)的调用是由JVM使用相同的字节码(invokevirtual)执行的。或invokeinterface)。

考虑到这一点,不支持static的原因就很清楚了。
您无法为静态方法创建代理!当然,Java Dynamic Proxies无法做到这一点,CGLIB也不能做到这一点。

支持这种功能将需要更改调用代码的字节码,因为调用静态方法是通过字节码中的invokestatic实现的,该方法将目标方法硬编码。

Spring文档的This部分详细说明了Spring AOP

关于spring - @Transactional与静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23569732/

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