上一篇 <<<Spring事务常识汇总
下一篇 >>>手动事务和自定义注解事务代码参考
Spring声明事务底层实现原理
Spring事务是基于AOP环绕通知和异常通知实现的
Spring申明事务底层是bean在实例化后,通过BeanPost的后置通知对注有@Transactional注解的类进行TransactionInterceptor拦截器增强,根据是否有接口创建CGLIB或JDK动态代理类。方法执行的时候通过AOP的责任链和递归方式实现。
不过申明事务要启用,必须加上@EnableTransactionManagement注解才可以。
核心代码执行流程
1、注解@EnableTransactionManagement开启事务支持
2、@Import({TransactionManagementConfigurationSelector.class})
3、TransactionManagementConfigurationSelector祖宗ImportSelector,自动注入AutoProxyRegistrar.class和ProxyTransactionManagementConfiguration.class
4、AutoProxyRegistrar.class实际注入InfrastructureAdvisorAutoProxyCreator.class,它的祖宗是BeanPostProcessor.class。
beanId:org.springframework.aop.config.internalAutoProxyCreator
class:AspectJAwareAdvisorAutoProxyCreator.class
5、ProxyTransactionManagementConfiguration.class实际注入拦截器transactionInterceptor.class,祖宗是MethodInterceptor.class
beanId:transactionInterceptor
class:TransactionInterceptor.class
6、程序启动后调用BeanPostProcessor的后置处理器,找到AbstractAutoProxyCreator的postProcessAfterInitialization方法,将注有@Transactional注解的增强器加入到代理类中,和AOP初始化一致
Object[] specificInterceptors = this.getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, (TargetSource)null);
7、方法执行的时候,会调用代理类的invoke方法或intercept方法,真正通过AOP的责任链和递归方式执行拦截。
InfrastructureAdvisorAutoProxyCreator作用有那些
它的父类是AbstractAutoProxyCreator,祖宗是BeanPostProcessor,完成启动时候通过检测方法上面是否有@Transactional注解来进行对bean的增强。
TransactionInterceptor 的作用
它的祖宗是MethodInterceptor,在方法真正执行的时候,主要完成对事务的拦截,在开始之前创建事务,完成后提交事务,如果碰到异常就回滚事务的操作。
推荐阅读:
<<<Spring IOC的初始化原理
<<<SpringBean的生命周期流程图
<<<SpringBean单例情况下解决循环依赖的原理
<<<Spring AOP的底层原理
<<<Spring AOP通知责任链模式图解
<<<Spring AOP核心源码解读
<<<Spring事务常识汇总
<<<手动事务和自定义注解事务代码参考
<<<Spring常用注解汇总
网友评论