核心类

InfrastructureAdvisorAutoProxyCreator

本质是一个后置处理器,和AOP的后置处理器类似,但比AOP的使用级别低。当开启AOP代理模式后,优先使用AOP的后置处理器。

AopConfigUtils:

  1. /**
  2. * The bean name of the internally managed auto-proxy creator.
  3. */
  4. //和AOP一样都向容器注入以此为name的后置处理器,进行代理类的创建
  5. public static final String AUTO_PROXY_CREATOR_BEAN_NAME =
  6. "org.springframework.aop.config.internalAutoProxyCreator";
  7.  
  8. /**
  9. * Stores the auto proxy creator classes in escalation order.
  10. */
  11. //按升级的顺序存储进行代理类创建的后置处理器
  12. private static final List<Class<?>> APC_PRIORITY_LIST = new ArrayList<Class<?>>();
  13.  
  14. /**
  15. * Setup the escalation list.
  16. */
  17. //代理创建类后置处理器升级列表,下标越大等级越高
  18. static {
  19. APC_PRIORITY_LIST.add(InfrastructureAdvisorAutoProxyCreator.class);
  20. APC_PRIORITY_LIST.add(AspectJAwareAdvisorAutoProxyCreator.class);
  21. APC_PRIORITY_LIST.add(AnnotationAwareAspectJAutoProxyCreator.class);
  22. }

源码跟踪

查看注解@EnableTransactionManagement源码,通过@Import导入TransactionManagementConfigurationSelector类,在类的重写方法中可以看到向容器注入了两个类AutoProxyRegistrar、ProxyTransactionManagementConfiguration

AutoProxyRegistrar

用于向容器中注册事务管理用的后置处理器

==》org.springframework.context.annotation.AutoProxyRegistrar#registerBeanDefinitions

AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry);

==》org.springframework.aop.config.AopConfigUtils#registerAutoProxyCreatorIfNecessary(org.springframework.beans.factory.support.BeanDefinitionRegistry)

==》org.springframework.aop.config.AopConfigUtils#registerAutoProxyCreatorIfNecessary(org.springframework.beans.factory.support.BeanDefinitionRegistry, java.lang.Object)

==》org.springframework.aop.config.AopConfigUtils#registerOrEscalateApcAsRequired

//此类下检查容器中是否有name为:"org.springframework.aop.config.internalAutoProxyCreator"的后置处理器bean,如果没有则注册,如果有则比较等级大小,若是等级大则对原beanDefination升级。例如:如果启用了AOP则不用升级

 

ProxyTransactionManagementConfiguration

配置事务管理所需的管理器、参数等

  1. @Configuration
  2. public class ProxyTransactionManagementConfiguration extends AbstractTransactionManagementConfiguration {
  3. //类似AOP,这里创建了一个用于事务Advisor的Bean
  4. @Bean(name = TransactionManagementConfigUtils.TRANSACTION_ADVISOR_BEAN_NAME)
  5. @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
  6. public BeanFactoryTransactionAttributeSourceAdvisor transactionAdvisor() {
  7. BeanFactoryTransactionAttributeSourceAdvisor advisor = new BeanFactoryTransactionAttributeSourceAdvisor();
  8. advisor.setTransactionAttributeSource(transactionAttributeSource());
  9. advisor.setAdvice(transactionInterceptor());
  10. advisor.setOrder(this.enableTx.<Integer>getNumber("order"));
  11. return advisor;
  12. }
  13. //封装事务管理配置的参数,@Transactional(..)中的参数
  14. @Bean
  15. @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
  16. public TransactionAttributeSource transactionAttributeSource() {
  17. return new AnnotationTransactionAttributeSource();
  18. }
  19. //封装事务用的advice为Interceptor,并关联上了事务管理器
  20. // TransactionInterceptor与AOP的Interceptor一样都继承自MethodInterceptor
  21. //事务管理器主要用来控制事务,commit、rollback等
  22. @Bean
  23. @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
  24. public TransactionInterceptor transactionInterceptor() {
  25. TransactionInterceptor interceptor = new TransactionInterceptor();
  26. interceptor.setTransactionAttributeSource(transactionAttributeSource());
  27. if (this.txManager != null) {
  28. interceptor.setTransactionManager(this.txManager);
  29. }
  30. return interceptor;
  31. }
  32.  
  33. }

运行时源码

运行时原理同AOP,对添加了@Transactional注解的类做代理,对被代理类的方法进行增强处理,执行一个拦截器链。跟踪进去可以发现Interceptor chain中多了一个TransactionIntercepor。通过此Interceptor在方法前开启事务,在方法后commit或rollback。

TransactionInterceptor

==》org.springframework.transaction.interceptor.TransactionInterceptor#invoke

==》 org.springframework.transaction.interceptor.TransactionAspectSupport#invokeWithinTransaction

  1. // If the transaction attribute is null, the method is non-transactional.
  2. //获取事务相关属性、管理器
  3. final TransactionAttribute txAttr = getTransactionAttributeSource().getTransactionAttribute(method, targetClass);
  4. final PlatformTransactionManager tm = determineTransactionManager(txAttr);
  5. final String joinpointIdentification = methodIdentification(method, targetClass, txAttr);
  6.  
  7. if (txAttr == null || !(tm instanceof CallbackPreferringPlatformTransactionManager)) {
  8. // Standard transaction demarcation with getTransaction and commit/rollback calls.
  9. //开启一个事务
  10. TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
  11. Object retVal = null;
  12. try {
  13. // This is an around advice: Invoke the next interceptor in the chain.
  14. // This will normally result in a target object being invoked.
  15. //调用被代理类的方法
  16. retVal = invocation.proceedWithInvocation();
  17. }
  18. catch (Throwable ex) {
  19. // target invocation exception
  20. //回滚事务
  21. completeTransactionAfterThrowing(txInfo, ex);
  22. throw ex;
  23. }
  24. finally {
  25. cleanupTransactionInfo(txInfo);
  26. }
  27. //提交事务
  28. commitTransactionAfterReturning(txInfo);
  29. return retVal;
  30. }

流程梳理

1、 创建后置处理器InfrastructureAdvisorAutoProxyCreator

2、 创建TransactionInterceptor,加入interceptor chain。

3、 对指定后置处理器为InfrastructureAdvisorAutoProxyCreator的bean使用TransactionInterceptor进行事务处理。

Spring源码分析笔记--事务管理的更多相关文章

  1. Spring源码分析笔记--AOP

    核心类&方法 BeanDefinition Bean的定义信息,封装bean的基本信息,从中可以获取类名.是否是单例.是否被注入到其他bean中.是否懒加载.bean依赖的bean的名称等. ...

  2. Spring源码分析之`BeanFactoryPostProcessor`调用过程

    前文传送门: Spring源码分析之预启动流程 Spring源码分析之BeanFactory体系结构 本文内容: AbstractApplicationContext#refresh前部分的一点小内容 ...

  3. Spring源码分析之Bean的创建过程详解

    前文传送门: Spring源码分析之预启动流程 Spring源码分析之BeanFactory体系结构 Spring源码分析之BeanFactoryPostProcessor调用过程详解 本文内容: 在 ...

  4. Spring源码分析之循环依赖及解决方案

    Spring源码分析之循环依赖及解决方案 往期文章: Spring源码分析之预启动流程 Spring源码分析之BeanFactory体系结构 Spring源码分析之BeanFactoryPostPro ...

  5. Spring源码分析之AOP从解析到调用

    正文: 在上一篇,我们对IOC核心部分流程已经分析完毕,相信小伙伴们有所收获,从这一篇开始,我们将会踏上新的旅程,即Spring的另一核心:AOP! 首先,为了让大家能更有效的理解AOP,先带大家过一 ...

  6. Spring 源码学习笔记11——Spring事务

    Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...

  7. Spring源码学习笔记12——总结篇,IOC,Bean的生命周期,三大扩展点

    Spring源码学习笔记12--总结篇,IOC,Bean的生命周期,三大扩展点 参考了Spring 官网文档 https://docs.spring.io/spring-framework/docs/ ...

  8. Spring源码分析专题 —— 阅读指引

    阅读源码的意义 更深入理解框架原理,印象更深刻 学习优秀的编程风格.编程技巧.设计思想 解决实际问题,如修复框架中的bug,或是参考框架源码,结合实际业务需求编写一个独有的框架 阅读源码的方法 首先是 ...

  9. Spring 源码学习笔记10——Spring AOP

    Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...

随机推荐

  1. SQL SERVER 学习过程(一)

    还记得以前在学校的学习过数据库SQL SERVER 2008 R2 的教程,从学校毕业出来后的哪家单位基本没怎么使用过数据库,现在也忘得差不多了 做些相关的练习熟悉熟悉 --创建数据库-- creat ...

  2. Vue 源码解读(9)—— 编译器 之 优化

    前言 上一篇文章 Vue 源码解读(8)-- 编译器 之 解析 详细详解了编译器的第一部分,如何将 html 模版字符串编译成 AST.今天带来编译器的第二部分,优化 AST,也是大家常说的静态标记. ...

  3. C# Control.BeginInvoke、synchronizationcontext.post、delegate.BeginInvoke的运行原理

    背景 用到的知识点 1.windows消息机制 备注:鼠标点击.键盘等事件产生的消息要放入系统消息队列,然后再分配到应用程序线程消息队列.软件PostMessage的消息直接进入应用程序线程消息队列, ...

  4. 【C# IO 操作】C#修改文件或文件夹的权限,为指定用户、用户组添加完全控制权限

    代码实现 在C盘添加一个文件夹,并在文件夹内部,新建一个文本文件,如图所示: 该文件夹下,新建一个文本文件,如图所示: 为文件添加完全控制权限: /// <summary> /// 为文件 ...

  5. Oracle的用户权限和角色

    用户和权限 LOCK|UNLOCK创建用户时是否锁定,默认为锁定状态.锁定的用户无法正常的登录进行数据库操作. --给普通用户SCOTT解锁,同时把SCOTT用户的密码进行修改 --语法结构:ALTE ...

  6. 深入理解ThreadLocal及其变种

    ThreadLocal 定义 ThreadLocal很容易让人望文生义,想当然地认为是一个"本地线程". 其实,ThreadLocal并不是一个Thread,而是Thread的局部 ...

  7. gradle , maven , ant , ivy , grant之间的区别

    java项目构建工具 gradle Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具. 它抛弃了基于XML的各种繁琐配置.它使用一种基于Groovy的特 ...

  8. startActivityForResult跳转后回调数据

    从AActivity向BActivity跳转后,关闭BActivity并向AActivity回调一些数据: 建立AActivity.java文件: 1 public class AActivity e ...

  9. 将ISO镜像文件制作成USB disk

    制作USB Live盘有Universal USB Installer.UNetbootin.WinSetupFromUSB.LinuxLive USB Creator.YUMI(Your Unive ...

  10. SpringMVC入门一:基础知识(依赖、注解、文件上传/下载、拦截器、异常处理等)

    为了使Spring可插入MVC架构,SpringFrameWork在Spring基础上开发SpringMVC框架,从而使用Spring进行WEB开发时可以选择使用Spring的SpringMVC框架作 ...