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 启动时的加载顺序问题。

相关推荐
cike_y10 小时前
Mybatis-万能的Map&模糊查询
java·开发语言·mybatis·安全开发
罗政11 小时前
mybatis-plus插件解决sql报错:this is incompatible with sql_mode=only_full_group_by ”
数据库·sql·mybatis
小句13 小时前
MyBatis源码学习
学习·mybatis
阿拉斯攀登13 小时前
设计模式:责任链模式(mybatis数据权限实现)
设计模式·mybatis·责任链模式
阿拉斯攀登13 小时前
设计模式:责任链模式(MyBatis)
设计模式·mybatis·责任链模式
无名-CODING14 小时前
MyBatis 动态 SQL 全攻略
数据库·sql·mybatis
java1234_小锋1 天前
[免费]SpringBoot+Vue勤工助学管理系统【论文+源码+SQL脚本】
spring boot·后端·mybatis·勤工助学
一灰灰1 天前
开发调试与生产分析的利器:MyBatis SQL日志合并插件,让复杂日志秒变可执行SQL
chrome·后端·mybatis
故渊ZY1 天前
MyBatis事务原理与实战指南
java·mybatis
长安er1 天前
LeetCode 62/64/5/1143多维动态规划核心题型总结
算法·leetcode·mybatis·动态规划