【问题标题】:Understanding Spring AOP and Transaction Aspect了解 Spring AOP 和事务方面
【发布时间】:2020-12-18 06:05:13
【问题描述】:
我正在研究 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 处理事务行为。呼叫是如何转接给它的?
【问题讨论】:
标签:
spring
spring-aop
spring-transactions
spring-aspects
【解决方案1】:
在 JDK 代理方面,您必须在创建代理对象时提供 InvocationHandler 实现。当代理对象被调用时,这个InvocationHandler 将围绕实际对象被调用。 (有关 JDK 代理如何工作的 hello world 示例,请参阅 this)
就 spring 事务而言,它已经附带了 InvocationHandler 实现(即 JdkDynamicAopProxy)。然后它将以某种方式调用事务方面(即TransactionInterceptor)。事务方面负责控制整个工作流程,例如何时创建、提交或回滚事务以及何时实际执行实际方法等。
事务方面还委托PlatformTransactionManager 实际启动、提交和回滚事务。因为不同的技术有自己的方式来启动、提交和回滚一个事务,所以需要引入一个PlatformTransactionManager作为接口来抽象这些操作,这样我们就可以通过简单地切换事务方面的PlatformTransactionManager实现来切换不同的事务技术。 .
回到你的问题:
获取连接和启动事务的 jdbc 代码在哪里
书面。是在 Spring Proxy 对象中还是在任何 Aspect Class 中。
没有。实际上是PlatformTransactionManager获取连接并启动切面调用的事务。
Spring 是在代理对象中插入事务行为代码还是
是使用 PlatformTransactionManager 来做到这一点吗?
AOP 适合这个流程。
Spring 在方面对象中插入事务行为(即TransactionInterceptor)。然后方面将委托给PlatformTransactionManager 以实际启动、提交和回滚事务。
如何在此处调用 Aspect 处理事务行为
如果是。呼叫是如何转接给它的?
假设使用 JDK 代理,调用流程是这样的:
- 有人在 JDK 代理上调用
-
将调用此代理的
InvocationHandler(即JdkDynamicAopProxy)
-
InvocationHandler 以某种方式调用 Spring 事务方面(即 TransactionInterceptor)
- 事务方面委托
PlatformTransactionManager 在必要时实际启动、提交和回滚事务。