【问题标题】: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 代理,调用流程是这样的:

  1. 有人在 JDK 代理上调用
  2. 将调用此代理的InvocationHandler(即JdkDynamicAopProxy
  3. InvocationHandler 以某种方式调用 Spring 事务方面(即 TransactionInterceptor
  4. 事务方面委托PlatformTransactionManager 在必要时实际启动、提交和回滚事务。

【讨论】:

    猜你喜欢
    • 2014-11-30
    • 2010-11-03
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    相关资源
    最近更新 更多