都说声明式事务是通过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,我们看一下它的继承关系:

发现它算是一个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
