mybatis二级缓存类加载问题

问题

@CacheNamespace 修饰的接口,例如MapperA

要先与@CacheNamespaceRef(MapperA.class)修饰的接口加载

你遇到的问题是由于 Spring Boot 启动时,加载顺序导致 B 先加载,而 A 的缓存命名空间还没有被创建。这是 MyBatis 在解析 @CacheNamespaceRef 时的常见问题,因为它依赖于 A 的命名空间已经存在。

解决方案:

1. 确保加载顺序

可以通过以下方法确保 A 先于 B 加载:

  • 分配加载顺序 :可以通过使用 Spring 的 @DependsOn 注解来显式声明依赖关系,确保 BA 加载完之后才被加载。

例如:

java 复制代码
@CacheNamespace
public interface AMapper {
    // A Mapper methods
}

@CacheNamespaceRef(AMapper.class)
@DependsOn("AMapper")  // 显式依赖A的加载
public interface BMapper {
    // B Mapper methods
}
  • @DependsOn 可以确保 BA 创建后才会被加载。
2. 使用 Spring Bean 的初始化顺序

在 Spring Boot 中,通过将 Mapper 注册为 Spring Bean,你可以控制它们的初始化顺序。

  • 自定义 Mapper 的加载顺序
    如果你使用 @MapperScan 来自动扫描 Mapper,可以手动通过 Java Config 配置 Mapper 的初始化顺序。

例如:

java 复制代码
@Configuration
public class MyBatisConfig {
    @Bean
    public AMapper aMapper(SqlSessionFactory sqlSessionFactory) {
        return sqlSessionFactory.getMapper(AMapper.class);
    }

    @Bean
    public BMapper bMapper(SqlSessionFactory sqlSessionFactory) {
        // 确保 AMapper 已经初始化
        aMapper(sqlSessionFactory);
        return sqlSessionFactory.getMapper(BMapper.class);
    }
}

这样确保了 AMapperBMapper 之前被初始化。

3. 延迟加载 BMapper

你可以使用 @Lazy 注解延迟加载 BMapper,这样 BMapper 只有在需要时才会被加载,从而确保 AMapper 已经加载完成。

例如:

java 复制代码
@CacheNamespace
public interface AMapper {
    // A Mapper methods
}

@CacheNamespaceRef(AMapper.class)
@Lazy
public interface BMapper {
    // B Mapper methods
}

总结:

通过以上方法,你可以确保 BMapperA 的命名空间创建完成后加载,解决 Spring Boot 启动时的加载顺序问题。

相关推荐
山甫aa20 小时前
Javaweb---MyBatis增删改查
java·数据库·后端·mybatis·springboot
choumou_M1 天前
SpringBoot_2:MyBatis-Generator插件使用教程
spring boot·tomcat·mybatis
SQL-First布道者1 天前
全面解构传统持久层框架,拥抱真正的 SQL-First
java·数据库·spring boot·sql·spring·mybatis·spring jdbc
晚安code3 天前
MyBatis-Plus 分页插件与字段自动填充:两行配置告别 CRUD 重复劳动
mybatis
SQL-First布道者4 天前
持久层框架的评价标准:只有一个
java·spring boot·spring·tomcat·mybatis·spring jdbc
步行cgn4 天前
MyBatis 高级映射与延迟加载完全指南
java·tomcat·mybatis
mashirro4 天前
记一次基于ruoyi-vue新增小程序服务模块,小程序登陆相关
vue.js·小程序·mybatis
边境悍匪4 天前
蜗牛学苑 Java 智能体学习 Day24|SpringBoot 整合 MyBatis、分层解耦思维导图复盘
java·数据库·spring boot·学习·mybatis
抓哇小菜鸡5 天前
Spring Boot + 本地大模型(Ollama/DeepSeek) + MyBatis-Plus 企业级智能体数据分析系统从零到一源码全解析
spring boot·后端·mybatis