同学,这块是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 定义之前。
这个就是调整执行顺序的方式,同学