Spring 中 Transactional 注解原理

date
Feb 28, 2019
slug
transactional-of-spring
status
Published
tags
Dev
summary
利用 Spring 框架可以很容易的使用注解的方式来使用事务,为我们的开发带来了巨大的便利…
type
Post
利用 Spring 框架可以很容易的使用注解的方式来使用事务,为我们的开发带来了巨大的便利,这种便利的实现是通过 Spring 本身的一系列机制来实现的,主要包含动态代理和 Spring Bean 的加载过程。本文将深入源码,揭开层层面纱…

Spring @Transactional 的使用

我们只需要在对应的方法上使用 @Transactional 注解即可让这个方法在事务中执行。这里需要注意的是,如果是在一个类中的两个方法,事务是不会生效的。举例:
为何不会生效?是因为这样的调用不会经过 Spring 的代理,无法通过 Spring 的 advisor 来拦截数据库操作请求。

Spring BeanPostProcessor

首先我们来了解一下 Spring Bean 的生命周期
调用InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation(Class<?> beanClass, String beanName)bean实例化调用InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation(Object bean, String beanName)调用InstantiationAwareBeanPostProcessor的postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)bean注入properties分别调用BeanNameAware,BeanClassLoaderAware,BeanFactoryAware中的方法调用BeanPostProcessor的postProcessBeforeInitialization(Object bean, String beanName)调用InitializingBean的afterPropertiesSet方法调用自定义初始化方法调用BeanPostProcessor的postProcessAfterInitialization(Object bean, String beanName)调用DisposableBean的destroy()方法调用自定义销毁方法
作者:土豆肉丝盖浇饭
链接:https://www.jianshu.com/p/6d5c58168493
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
通过上面的流程我们可以看到,BeanPostProcessor 中的两个方法 postProcessBeforeInitializationpostProcessAfterInitialization 分别在 bean 调用 init 方法前后调用。其中对于对象的代理就是在 postProcessAfterInitialization 方法中完成的,用代理的 bean 来替换原来的 bean
默认情况下,BeanPostProcessor 的职能是通过默认实现类 DefaultAdvisorAutoProxyCreator实现的,类 DefaultAdvisorAutoProxyCreator继承自AbstractAdvisorAutoProxyCreator该类的继承关系如下图
notion image
AbstractAutoProxyCreator继承关系

DefaultAdvisorAutoProxyCreator 如何代理被@Transactional注解的方法所属类

来看看 AbstractAutoProxyCreator中发生了什么
跟进 wrapIfNecessary 方法
我们来看看生成的动态类是什么样子的?
notion image
Jietu20190228-174753@2x
其中有一个 advisor 为
adviceBeanName:org.springframework.transaction.interceptor.TransactionInterceptor#0

TransactionInterceptor 类

我们此时来看看 org.springframework.transaction.interceptor.TransactionInterceptor 里究竟是如何执行 SQL 语句的。我们需要关注的方法为 invoke 方法
查看 invokeWithinTransaction 方法
至此,我们基本了解了 Spring 声明式事务的工作流程

© Cyburger 2017 - 2025