请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

AbstractAutoProxyCreator和GlobalTransactionScanner执行顺序问题

引入seata之前 创建代理对象 使用的是AbstractAutowireCapableBeanFactory addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean)); --》getEarlyBeanReference 》 wrapIfNecessary createProxy seata 是如何做到先执行GlobalTransactionScanner里面的wrapIfNecessary方法添加advisor globalTransactionalInterceptor 之后才调用之前的方法创建代理对象的

正在回答

1回答

同学,这块是spring生命周期和seata来进行整合的,

在使用 Seata 进行分布式事务管理时,Seata 通过其 GlobalTransactionScanner 类来管理事务的代理对象。

Seata 的主要目标是在 Spring 应用中引入全局事务管理功能,而这一功能是通过在 Spring 的 Bean 

生命周期中插入自定义的 Advisor 和 Interceptor 来实现的。

在引入 Seata 之前,Spring 的 AbstractAutowireCapableBeanFactory 会在创建 Bean 时调用 addSingletonFactory 方法,并通过 getEarlyBeanReference 方法来创建代理对象。Seata 通过 GlobalTransactionScanner 介入这个过程,确保在 Spring 创建代理对象之前,先插入 Seata 的事务管理逻辑。


回到你的标题的问题,AbstractAutoProxyCreator和GlobalTransactionScanner执行顺序问题

为了确保 Seata 的事务管理逻辑能够正确地插入到代理对象中,通常需要确保 GlobalTransactionScanner

 在 AbstractAutoProxyCreator 之前执行。

初始化顺序调整:

在 Spring 配置中,可以通过调整 @Order 注解或者实现 Ordered 接口来控制 BeanPostProcessor 的执行顺序。

GlobalTransactionScanner 通常会使用较低的 Order 值(例如 Ordered.LOWEST_PRECEDENCE - 10),

以确保它比大多数其他 BeanPostProcessor 先执行。

Bean 定义顺序调整:

在 XML 配置或 Java Config 中,可以通过调整 Bean 的定义顺序来控制 BeanPostProcessor 的执行顺序。

确保 GlobalTransactionScanner 的 Bean 定义在 AbstractAutoProxyCreator 的 Bean 定义之前。

这个就是调整执行顺序的方式,同学

1 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信