[email protected]后台会发生什么?

我想知道当您使用@Transactional注释一个方法时,实际会发生什么?
当然,我知道Spring将在事务中封装该方法

但是,我有以下疑问:

  1. 我听说Spring创建了一个代理类?有人能更深入地解释一下吗该代理类中实际驻留的是什么?实际的类发生了什么?我如何才能看到Spring创建的代理类
  2. 我还在Spring文档中读到:

注意:由于此机制基于代理,只有通过代理传入的“外部”方法调用才会被拦截。这意味着“自调用”,即目标对象内调用目标对象其他方法的方法,即使调用的方法标记为@Transactional,在运行时也不会导致实际事务

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

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

这是一个大话题。Spring参考文档有多个章节专门介绍它。我建议阅读面向方面编程https://docs.spring.io/spring-framework/docs/current/reference/html/data-access.html#transaction“rel=”noreferrer“>交易,由于Spring的声明性事务支持在其基础上使用AOP。

但在非常高的级别上,Spring为类创建代理,这些类在类本身或成员上声明@Transactional。代理在运行时基本不可见。它为Spring提供了一种将方法调用之前、之后或前后的行为注入被代理对象的方法。事务管理只是可以连接的行为的一个例子。安全检查是另一个问题。您也可以提供自己的日志记录。因此,当您使用@Transactional注释一个方法时,Spring会动态创建一个代理,该代理实现与您正在注释的类相同的接口。当客户机对您的对象进行调用时,会截获调用,并通过代理机制注入行为

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

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

请注意,BeanFactoryPostProcessor代码现在会有点不同,因为它是在Spring1.x时间框架中编写的。但希望它能给你一个想法。我有一个更新版本,我可能会提供

发表评论