Spring事务
2021-06-24 16:21:05 8 举报
Spring事务
作者其他创作
大纲/内容
TransactionInterceptor.invokeWithinTransaction
注册事务管理配置
1:注册BeanPostProcessor
TransactionAttributeSource.findTransactionAttribute
TransactionAttributeSource.computeTransactionAttribute
1:根据传入的(方法名,代理对象类名),获取事务属性2:获取步骤1启动时注册的PlatformTransactionManager事务管理器3:获取joinpointIdentification连接点定义4:根据1、2、3创建事务createTransactionIfNecessary
3:执行动态代理构造的事务方法
构建TransactionAttributeSourcePointcut并将TransactionAttributeSource传入
BeanFactoryTransactionAttributeSourceAdvisor
注册InfrastructureAdvisorAutoProxyCreator到Spring中
((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this)
TransactionAnnotationParser.parseTransactionAnnotation(element)
ReflectiveMethodInvocation.proceed()
AbstractAutoProxyCreator.postProcessAfterInitialization
要求要先注册一个PlatformTransactionManager的bean
用来根据方法名及类名翻译出@transaction注解的属性
AutoProxyRegistrar
这一步最重要的就是向Spring容器注入了一个自动代理创建器: org.springframework.aop.config.internalAutoProxyCreator,这里有个小细节注意一下,由于AOP和事务注册的都是 名字为org.springframework.aop.config.internalAutoProxyCreator 的BeanPostProcessor,但是只会保留一个,AOP的会 覆盖事务的, 因为AOP优先级更大
所以构建事务代理对象的大体流程简单说就是,1:在Spring初始化结束后生成对象或代理对象作为target,2:根据TransactionAttributeSourcePointcut切点类判断该target是否需要需要切点增强,3:如果需要,使用构造的TransactionAttributeSource翻译器来翻译切点属性。4:然后动态代理工厂使用构造的BeanFactoryTransactionAttributeSourceAdvisor(怎么增强)和TransactionInterceptor(增强了以后该对象执行时做什么)来进行构造动态代理对象。5:放入Spring容器中。
使用isEligibleAdvisorBean,用于过滤掉不是BeanDefinition.ROLE_INFRASTRUCTURE的BeanDefinition
@EnableTransactionManagement
默认this.annotationParsers.add(new SpringTransactionAnnotationParser());也支持JtaTransactionAnnotationParser和Ejb3TransactionAnnotationParser
构建拦截器,即如果需要执行事务,应该如何做的那段逻辑
TransactionAttributeSource
AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry);
JdkDynamicAopProxy
ProxyTransactionManagementConfiguration
TransactionManagementConfigurationSelector
执行事务
TransactionInterceptor.invoke
注册自动代理类
用来解析@Transaction属性的工具,AnnotationTransactionAttributeSource
3:构造事务代理对象
0 条评论
回复 删除
下一页