You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 10:15:10