Spring声明式事务原理

都说声明式事务是通过AOP实现的,那么我们在一探其究竟之前,先来看看AOP的执行流程。有两个入口来创建代理,第一种是没有循环依赖的情况下,是在AbstractAutowireCapableBeanFactory#initializeBean方法中创建。第二种是当有循环依赖的时候,从三级缓存singletonFactories拿到二级缓存earlySingletionObjects的时候,执行AbstractAutoProxyCreator#getEarlyBeanReference方法来创建代理。

首先看第一种情况的执行流程:

1.org.springframework.context.support.AbstractApplicationContext#refresh

2.org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization --实例化单例类

3.org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons

4.org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String)

5.org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean

6.org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])

7.org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean

8.org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)

在这个方法里面先调用各种AwareMethods,然后调用BeanPostProcessor的BeforeInitialization方法,之后再调用afterPropertiesSet,再之后调用initMethod,最后调用BeanPostProcessor的afterInitialization方法(也就是在这么方法中完成AOP代理类的创建)。

9.org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization

10.org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessAfterInitialization

11.org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#wrapIfNecessary

12.org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#createProxy

13.org.springframework.aop.framework.ProxyFactory#getProxy(java.lang.ClassLoader)

14.org.springframework.aop.framework.ProxyCreatorSupport#createAopProxy

15.org.springframework.aop.framework.DefaultAopProxyFactory#createAopProxy

在这个方法中决定使用Cglib还是JDK动态代理

16.回到第13步调用org.springframework.aop.framework.CglibAopProxy#getProxy(java.lang.ClassLoader)/

org.springframework.aop.framework.JdkDynamicAopProxy#getProxy(java.lang.ClassLoader)

来创建代理对象。

然后看第二种有循环依赖的情况:

假设循环依赖为:A->B,B->A

前7步同第一种情况,我们从org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean方法开始看。

8.org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#addSingletonFactory,将A放入三级缓存,存放的是ObjectFactory

9.org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean,填充属性值B,因为By依赖A,所以实例化B的时候同样会调用populateBean方法来填充属性A,此时会再次调用A的getBean。

10.回到org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean

11.org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String)

12.org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, boolean),该方法中把A从三级缓存拿到二级缓存,调用singletonFactory的getObject()方法。

13.org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#getEarlyBeanReference

14.org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#getEarlyBeanReference

15.org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#wrapIfNecessary,到此会发现又回到第一种情况的第11步。

动态代理的实现细节大体是将AOP封装成一系列Advisor,再将Advisor的List封装到AdvisedSupport,CglibAopProxy持有该AdvisedSupport对象,在创建代理对象的时候将一系列的Advisor放到DynamicAdvisesInterceptor中,DynamicAdvisesInterceptor继承自MethodInterceptor。

开始事务的注解是:@EnableTransactionManagement

以@Enable开头的注解其实都是通过@Import注解引入特定场景下的类。@EnableTransactionManagement也不例外,他引入的是@Import(TransactionManagementConfigurationSelector.class),TransactionManagementConfigurationSelector是一个ImportSelector,我们看它的selectImports方法,要注册是AutoProxyRegistrar和ProxyTransactionManagementConfiguration。

我们首先看一下AutoProxyRegistrar:AutoProxyRegistrar实现了ImportBeanDefinitionRegistrar接口,我们看他的registerBeanDefinitions方法,其调用栈如下:

1.org.springframework.context.annotation.AutoProxyRegistrar#registerBeanDefinitions

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

3.org.springframework.aop.config.AopConfigUtils#registerAutoProxyCreatorIfNecessary(org.springframework.beans.factory.support.BeanDefinitionRegistry, java.lang.Object)    在这个方法中声明要注册的类是InfrastructureAdvisorAutoProxyCreator,我们看一下它的继承关系:

InfrastructureAdvisorAutoProxyCreator继承关系

发现它算是一个BeanPostProcessor,在bean实例化的时候,会调用它的postProcessAfterInitialization,之后的逻辑就是上述AOP的执行流程了,在创建代理的过程中将自定义增强和通用拦截进行合并,封装到Advisor数组中,在创建AopProxy的时候将该数组封装为AdvisedSupport作为AopProxy的属性,CglibAopProxy在创建代理时将AdvisedSupport对象封装到DynamicAdvisedInterceptor中,CglibAopProxy.DynamicAdvisedInterceptor#intercept的方法中进行调用。

最后来看一下ProxyTransactionManagementConfiguration:它是一个配置类,内部定义了三个bean:

1.BeanFactoryTransactionAttributeSourceAdvisor // 事务增强

2.TransactionAttributeSource // 事务解析器

3.TransactionInterceptor // 事务拦截器

我们着重看一下TransactionInterceptor#invoke的调用栈:

1.org.springframework.transaction.interceptor.TransactionInterceptor#invoke

2.org.springframework.transaction.interceptor.TransactionAspectSupport#invokeWithinTransaction

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容