@Transactional用静态方法

Kar*_*G C 5 spring transactions

为什么我们不能使用@Transactional静态方法来管理我的Spring项目中的事务?

@Transactional 适用于非静态方法但不适用于静态方法的任何特定原因?

geo*_*and 10

为了理解为什么你提出的东西不起作用,你必须首先从高层次上理解Spring如何处理使用的bean @Transactional.

当您将方法或类注释为@TransactionalSpring Bean时,Spring会有效地为该类创建代理(使用JDK动态代理或CGLIB代理).这意味着,只要你的类被使用(从Spring管理代码即是),它不是你的代码,立即调用,但它首先做什么是必要的,然后你的代码被称为(在缓存支持的情况下,代理您的甚至可能根本不会调用代码.这里要记住的一个关键是调用代码(如果你愿意,调用站点)根本不会改变,并且JVM使用相同的字节码调用所需的目标方法(代理方法)(invokevirtual)调用接口).

考虑到这一点,不支持静态的原因变得清晰.您无法为静态方法创建代理!当然Java Dynamic Proxies不能这样做,CGLIB也不能.

支持这样的特性需要改变调用代码的字节码,因为调用静态方法是通过字节码中的invokestatic实现的,该方法对目标方法进行硬编码.

Spring文档的这一部分详细介绍了Spring AOP