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 中的两个方法
postProcessBeforeInitialization
和postProcessAfterInitialization
分别在 bean 调用 init 方法前后调用。其中对于对象的代理就是在 postProcessAfterInitialization
方法中完成的,用代理的 bean 来替换原来的 bean默认情况下,
BeanPostProcessor
的职能是通过默认实现类 DefaultAdvisorAutoProxyCreator
实现的,类 DefaultAdvisorAutoProxyCreator
继承自AbstractAdvisorAutoProxyCreator
该类的继承关系如下图
AbstractAutoProxyCreator继承关系
DefaultAdvisorAutoProxyCreator
如何代理被@Transactional
注解的方法所属类
来看看
AbstractAutoProxyCreator
中发生了什么跟进
wrapIfNecessary
方法我们来看看生成的动态类是什么样子的?

Jietu20190228-174753@2x
其中有一个 advisor 为
adviceBeanName:org.springframework.transaction.interceptor.TransactionInterceptor#0
TransactionInterceptor 类
我们此时来看看
org.springframework.transaction.interceptor.TransactionInterceptor
里究竟是如何执行 SQL 语句的。我们需要关注的方法为 invoke
方法查看
invokeWithinTransaction
方法至此,我们基本了解了 Spring 声明式事务的工作流程