0

我正在研究当我们自动装配任何接口时 spring 提供的代理对象。这是了解https://www.youtube.com/watch?v=bEvGdWjeCy4&t=310s的一个很好的链接. 在这里他解释说,如果 POJO 实现了任何接口,那么 Spring 代理 bean 也实现了该接口(使用 JDK 代理机制)并添加额外的逻辑,例如事务逻辑(如果该方法使用 jdbc 代码注释或委托给 PlatformTransactionManager)。Spring 为我们提供了一个包装器对象,该对象具有对真实对象的引用,并且它具有在使用 MethodInvocationHandler 调用原始方法之前和之后运行的附加代码。所以我的问题是spring是如何管理该事务的。获取连接和启动事务的jdbc代码是在哪里编写的。它是在 Spring Proxy 对象中还是在任何 Aspect Class 中。

就像在 AOP 中一样,Aspects 基本上是横切关注点,例如整个应用程序共有的事务。Spring 是在代理对象中插入事务行为代码还是使用 PlatformTransactionManager 来执行此操作以及此 AOP 适合此流程的位置。如果是,如何在此处调用 Aspect 处理事务行为。呼叫是如何转移到它的?

4

1 回答 1

0

就 JDK 代理而言,您必须InvocationHandler在创建代理对象时提供一个实现。当代理对象被调用时,InvocationHandler它将围绕实际对象被调用。(有关JDK 代理如何工作的 hello world 示例,请参阅此内容)

就 spring 事务而言,它已经附带了一个InvocationHandler实现(即JdkDynamicAopProxy)。然后它将以某种方式调用事务方面(即TransactionInterceptor)。事务方面负责控制整个工作流程,例如何时创建、提交或回滚事务以及何时实际执行实际方法等。

事务方面也委托给PlatformTransactionManager实际启动、提交和回滚事务。因为不同的技术有自己的方式来启动、提交和回滚一个事务,所以需要引入一个PlatformTransactionManager作为接口来抽象这些操作,这样我们就可以通过简单地切换PlatformTransactionManager事务方面内部的实现来切换不同的事务技术。

所以回到你的问题:

用于获取连接和启动事务的 jdbc 代码的编写位置。它是在 Spring Proxy 对象中还是在任何 Aspect Class 中。

他们都没有。实际上是PlatformTransactionManager获取连接并启动切面调用的事务。

Spring 是在代理对象中插入事务行为代码还是使用 PlatformTransactionManager 来执行此操作以及此 AOP 适合此流程的位置。

TransactionInterceptorSpring 在方面对象(即)中插入事务行为。方面然后委托给PlatformTransactionManager实际启动、提交和回滚事务。

如果是,如何在此处调用 Aspect 处理事务行为。呼叫是如何转移到它的?

假设使用 JDK 代理,调用流程类似于:

  1. 有人在 JDK 代理上调用
  2. InvocationHandler这个代理的将被调用(即JdkDynamicAopProxy
  3. InvocationHandler以某种方式调用弹簧事务方面(即TransactionInterceptor
  4. PlatformTransactionManager如有必要,事务方面委托实际启动、提交和回滚事务。
于 2020-08-29T16:58:54.127 回答