gpt4 book ai didi

java - Spring - @Transactional - 后台发生了什么?

转载 作者:行者123 更新时间:2023-12-01 18:35:12 33 4
gpt4 key购买 nike

我想知道当你用@Transactional注释一个方法时实际上会发生什么?当然,我知道 Spring 会将该方法包装在 Transaction 中。

但是,我有以下疑问:

  1. 我听说 Spring 创建了一个代理类?有人可以更深入解释一下吗? 该代理类中实际存在什么?实际类里面会发生什么?以及如何查看Spring创建的代理类
  2. 我还在 Spring 文档中读到:

Note: Since this mechanism is based on proxies, only 'external' method calls coming in through the proxy will be intercepted. This means that 'self-invocation', i.e. a method within the target object calling some other method of the target object, won't lead to an actual transaction at runtime even if the invoked method is marked with @Transactional!

来源:http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html

为什么事务下只有外部方法调用而不是自调用方法?

最佳答案

这是一个很大的话题。 Spring 引用文档用了多个章节来介绍它。我建议阅读 Aspect-Oriented Programming 上的内容和 Transactions ,因为 Spring 的声明式事务支持在其基础上使用了 AOP。

但在非常高的层面上,Spring 为在类本身或成员上声明 @Transactional 的类创建代理。代理在运行时大部分是不可见的。它为 Spring 提供了一种在方法调用之前、之后或周围将行为注入(inject)到被代理的对象中的方法。事务管理只是可 Hook 行为的一个示例。安全检查是另一个示例。您也可以提供自己的日志记录等功能。因此,当您使用 @Transactional 注释方法时,Spring 会动态创建一个代理,该代理实现与您注释的类相同的接口(interface)。当客户端调用您的对象时,调用将被拦截并通过代理机制注入(inject)行为。

顺便说一句,EJB 中的事务工作方式类似。

正如您所观察到的,代理机制仅在来自某个外部对象的调用时才起作用。当您在对象内进行内部调用时,您实际上是通过 this 引用进行调用,这会绕过代理。然而,有一些方法可以解决这个问题。我在 this forum post 中解释了一种方法其中我使用 BeanFactoryPostProcessor 在运行时将代理实例注入(inject)到“自引用”类中。我将此引用保存到名为 me 的成员变量中。然后,如果我需要进行需要更改线程事务状态的内部调用,我可以通过代理直接调用(例如 me.someMethod()。)论坛帖子更详细地解释了.

请注意,BeanFactoryPostProcessor 代码现在会有点不同,因为它是在 Spring 1.x 时间范围内写回的。但希望它能给你一个想法。我有一个可能可以提供的更新版本。

关于java - Spring - @Transactional - 后台发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60075331/

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