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

相关推荐
就改了1 天前
MyBatis核心类用法详解
java·spring boot·后端·mybatis
momo3 天前
Java+WebAI黑马知识点
java·spring boot·mybatis
snow@li3 天前
MyBatis:动态 SQL 全景梳理
数据库·sql·mybatis
就改了3 天前
Mybatis快速入门大全(详细版)
java·spring boot·mybatis
qq_171538853 天前
深入浅出 MyBatis XML:从入门到精通
xml·java·mybatis
万亿少女的梦1683 天前
基于SSM、JSP与MySQL的秦皇岛旅游服务管理系统设计与实现
mysql·mybatis·ssm·jsp·spring mvc
jaysee-sjc3 天前
【JavaWeb】JDBC与Mybatis零基础入门详解
java·开发语言·前端·mybatis
dear_bi_MyOnly3 天前
【MyBatis 操作数据库】
java·数据库·学习·mybatis·学习方法
用户3126874877204 天前
分页插件到底怎么拦截 SQL?MyBatis-Plus 插件机制原理一次讲透
mybatis
马优晨4 天前
pring Boot + MyBatis + Redis 项目分层架构详解 —— 各层职责、关系与工作流程
架构·mybatis·spring项目分层架构详解·spring项目架构详解·spring各层职责·spring关系与工作流程