在Spring Boot应用中如何让Liquibase迁移先于MyBatis映射执行?
解决Liquibase迁移晚于MyBatis初始化问题的方案
Spring Boot 2.x+ 版本默认的自动配置规则已经保证Liquibase迁移操作会在MyBatis初始化前完成,只有当手动自定义MyBatis相关Bean、打破了自动配置的依赖顺序时,才会出现时序错乱的问题。官方推荐的实现方案有两种:
方案1:全局依赖配置(无代码侵入,优先推荐)
Spring Boot 2.4及以上版本支持通过全局Bean依赖配置直接指定MyBatis相关组件依赖Liquibase初始化Bean,无需修改业务代码,也不会触发循环依赖:
- 在application.properties中添加配置:
spring.beans.depends-on[0]=liquibase
- 如果使用yml格式的配置文件,写法如下:
spring: beans: depends-on: - liquibase
方案2:自定义MyBatis配置时显式指定依赖
如果你手动定义了SqlSessionFactory、MapperScannerConfigurer等MyBatis核心Bean,直接在对应Bean上声明依赖即可:
@Configuration public class MyBatisCustomConfig { @Bean @DependsOn("liquibase") public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); // 其他MyBatis配置逻辑,比如设置Mapper路径、别名包等 return factoryBean.getObject(); } }
你之前使用
@DependsOn触发循环依赖的核心原因是Liquibase的自定义逻辑(比如自定义ChangeLog处理器、迁移前置校验等)间接依赖了MyBatis的Mapper、SqlSession等组件,只要排查并移除Liquibase侧对MyBatis组件的依赖即可解决循环依赖问题。
生效校验规则
- 确认Liquibase初始化Bean的名称为默认的
liquibase,如果你自定义了Liquibase Bean的名称,需要将上述配置中的依赖名称替换为自定义的Bean名 - 多数据源场景下,需要为每个数据源对应的MyBatis配置,单独指定依赖对应数据源的Liquibase初始化Bean
内容的提问来源于stack exchange,提问作者J.J. Beam
相关产品推荐
相关产品推荐

