57、Spring5.x源码之旅五十八AOP事务的初始化流程一

  • 初始化流程图
  • 事务的初始化流程
    • AutoProxyRegistrar创建
  • TransactionalEventListenerFactory创建
  • InfrastructureAdvisorAutoProxyCreator创建
  • AbstractAutoProxyCreator的postProcessAfterInitialization
    • AbstractAdvisorAutoProxyCreator的findCandidateAdvisors
      • BeanFactoryAdvisorRetrievalHelper的findAdvisorBeans
      • BeanFactoryTransactionAttributeSourceAdvisor准备实例化
        • ProxyTransactionManagementConfiguration作为工厂被先实例化
      • BeanFactoryTransactionAttributeSourceAdvisor工厂方法属性注入
        • AnnotationTransactionAttributeSource和TransactionInterceptor实例化作为属性注入
      • BeanFactoryTransactionAttributeSourceAdvisor实例化

初始化流程图

*

事务的初始化流程

前面讲了事务的注解的作用,需要一些类的辅助,那这些类是什么时候创建,又是做什么的呢,我们来看看。

AutoProxyRegistrar创建

spring的初始化流程前面有讲过,会用ConfigurationClassPostProcessor进行注解配置类的解析,如果遇到ImportBeanDefinitionRegistrar的话,会进行实例化,然后到后面的加载bean定义的时候调用loadBeanDefinitionsFromRegistrars执行他们的registerBeanDefinitions方法,AutoProxyRegistrar会进行InfrastructureAdvisorAutoProxyCreator处理器的注册。

TransactionalEventListenerFactory创建

然后到了invokeBeanFactoryPostProcessors这里,内部的EventListenerMethodProcessor会进行postProcessBeanFactory处理,将TransactionalEventListenerFactory创建出来。
*

InfrastructureAdvisorAutoProxyCreator创建

*

AbstractAutoProxyCreator的postProcessAfterInitialization

随后进行实例化的时候,第一次调用InfrastructureAdvisorAutoProxyCreatorpostProcessAfterInitializationAOP寻找切面注解类似,这个也会去寻找事务注解并创建通知,并进行相应对象的动态代理:
*

AbstractAdvisorAutoProxyCreator的findCandidateAdvisors

先进行通知器的查找:
*

BeanFactoryAdvisorRetrievalHelper的findAdvisorBeans

先根据类型查找所有的Advisor,其实就是BeanFactoryTransactionAttributeSourceAdvisor
*

BeanFactoryTransactionAttributeSourceAdvisor准备实例化

然后直接进行获取:
*

ProxyTransactionManagementConfiguration作为工厂被先实例化

由于BeanFactoryTransactionAttributeSourceAdvisor的创建方法是bean注解的方法,属于工厂方法,所以得需要先有工厂实例,才可以反射调用方法实例化。
*
所以先是进行ProxyTransactionManagementConfiguration的实例化:
*

BeanFactoryTransactionAttributeSourceAdvisor工厂方法属性注入

这个工厂方法还有两个属性注入,所以又会去创建两个实例。
*

AnnotationTransactionAttributeSource和TransactionInterceptor实例化作为属性注入

其实他们也是用工厂方法创建的,只是前面已经把工厂ProxyTransactionManagementConfiguration创建了,所以这里只要直接反射调用工厂方法就好了:
*

BeanFactoryTransactionAttributeSourceAdvisor实例化

前面工厂实例化,工厂方法参数注入实例化后,就可以调用BeanFactoryTransactionAttributeSourceAdvisor的工厂方法进行实例化了。
*
我们把事务的一些类的初始化流程理了一下,所有相关的类也实例化了,主要是为了BeanFactoryTransactionAttributeSourceAdvisor的实例化,现在找到了这个通知器,后面就要检查每个实例是否需要通知器了,也就是AbstractAdvisorAutoProxyCreatorfindAdvisorsThatCanApply

好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。