了解Spring AOP和事务方面



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

与AOP一样,Aspects基本上是跨领域的关注点,例如整个应用程序通用的事务。Spring是在代理对象中插入事务行为代码,还是使用PlatformTransactionManager来做到这一点?这个AOP在这个流中适合哪里。特性是如何处理事务行为的,如果是的话。调用是如何转移到它的?

就JDK代理而言,在创建代理对象时必须提供InvocationHandler实现。当代理对象被调用时,这个InvocationHandler将围绕实际对象被调用。(有关JDK代理如何工作的helloworld示例,请参见此(

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

事务方面还委托PlatformTransactionManager实际启动、提交和回滚事务。由于不同的技术有自己的方法来启动、提交和回滚事务,因此有必要引入PlatformTransactionManager作为接口来抽象这些操作,这样我们就可以通过在事务方面简单地切换PlatformTransactionManager实现来切换不同的事务技术。

那么回到你的问题上来:

获取连接和启动事务的jdbc代码在哪里书面的它是在Spring Proxy对象中还是在任何Aspect类中。

没有。实际上是PlatformTransactionManager来获得连接并启动方面调用的事务。

Spring是在代理对象中插入事务行为代码,还是是使用PlatformTransactionManager来做这件事吗?这在哪里做AOP适合这个流。

Spring在方面对象(即TransactionInterceptor(中插入事务行为。这些方面然后委托PlatformTransactionManager来实际启动、提交和回滚事务。

特性如何处理此处调用的事务行为如果是的话。电话是如何转接到它的?

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

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

最新更新