第三节 Spring @Transactional原理及使用

亮子 2022-02-18 06:46:36 10734 0 0 0

1、Spring事务的机制

1)、注册事务切面逻辑

1)、扫描spring-boot-autoconfigure依赖包下的META-INF/spring.factories,加载文件里的TransactionAutoConfiguration类
2)、解析TransactionAutoConfiguration类里的@EnableTransactionManagement注解,根据该注解上的@Import加载TransactionManagementConfigurationSelector类
3)、通过TransactionManagementConfigurationSelector类的selectImports方法加载ProxyTransactionManagementConfiguration类
4)、ProxyTransactionManagementConfiguration类通过@Bean加载BeanFactoryTransactionAttributeSourceAdvisor类,该类实现了Pointcut,并且在该类里注入了实现了Advise接口的TransactionInterceptor类

2)、根据切面逻辑生成代理类

1)、加载AopAutoConfiguration类,根据proxyTargetClass配置来选择是使用jdk的proxy还是cglib来生成动态代理类,截图如下:
2)、解析@EnableAspectJAutoProxy注解,通过该注解上的@Import加载AspectJAutoProxyRegistrar类
3)、AspectJAutoProxyRegistrar类会向Spring容器注册AnnotationAwareAspectJAutoProxyCreator类,该类实现了BeanPostProcessor接口,所以这个aop逻辑是在Springbean生成过程中通过后置处理器逻辑来实现的。
4)、生成动态代理类的核心逻辑在AspectJAutoProxyRegistrar类的父类AbstractAutoProxyCreator类的postProcessAfterInitialization方法里,该方法实现的是后置处理器BeanPostProcessor类,用来生成动态代理类,这里看下具体逻辑:

3)、总结

@Transactional注解的逻辑是通过动态代理来实现的,而生成这个动态代理类分成了两步:
1、向spring容器注册事务相关的切面逻辑
2、根据切面逻辑生成动态代理

2、