前言
Spring的事务是基于AOP实现的,而AOP主要是通过Spring提供的扩展接口 ,这里我们主要关注如下两个方法: InstantiationAwareBeanPostProcessor :: postProcessBeforeInstantiation(bean 实例化之前调用)
BeanPostProcessor :: postProcessAfterInitialization (bean 初始化之后调用)
从开启事务支持的注解开始
@EnableTransactionManagement :Springboot启动类上的开启事务支持的注解,我们要使用事务需要在启动类上添加这个注解,那么它究竟做了什么呢?
点进去发现 : @Import({TransactionManagementConfigurationSelector.class})
它为我们导入了一个Selector,这种 ImportSelector 都会有一个 selectImports 的方法,主要的目的就是导入一些 bean。如图:这里总共导入了4个:InfrastructureAdvisorAutoProxyCreator:查找切面和创建代理
transactionAdvisor
transactionAttributeSource: 可以获取到事务的属性
transactionInterceptor:拦截代理对象的调用
InfrastructureAdvisorAutoProxyCreator
根据类图可以发现 InfrastructureAdvisorAutoProxyCreator 实现了 BeanPostProcessor 和InstantiationAwareBeanPostProcessor 所以重点看它和它父类的postProcessBeforeInstantiation 和 postProcessAfterInitialization方法
postProcessBeforeInstantiation:AOP的时候会把找到的切面等信息放入map中缓存,事务这里不会缓存,因为是直接找的advisor (beanName=org.springframework.transaction.config.internalTransactionAdvisor)。
postProcessAfterInitialization : 创建AOP和事务的代理对象,这里的流程就是去找到(findCandidateAdvisors() ) transactionAdvisor , 然后判断是否匹配,这里会用到transactionAttributeSource(可以获取到事务的属性)
@Transactional 查找过程为:先在实现类的方法上面找是否有,没有再去实现类去找,没有再去接口的方法上面去找,没有再去接口上面找。
transactionInterceptor
invocation.proceed()方法,该方法的调用用到了递归和责任链设计模式:
调用org.springframework.aop.framework.JdkDynamicAopProxy#invoke