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

相关推荐
virus59458 小时前
悟空CRM mybatis-3.5.3-mapper.dtd错误解决方案
java·开发语言·mybatis
-孤存-10 小时前
MyBatis数据库配置与SQL操作全解析
数据库·mybatis
csdn2015_12 小时前
MyBatis Generator 核心配置文件 generatorConfig.xml 完整配置项说明
java·mybatis
csdn2015_12 小时前
generatorConfig.xml 配置 Controller、Service 完整教程
xml·mybatis
tb_first15 小时前
万字超详细苍穹外卖学习笔记1
java·jvm·spring boot·笔记·学习·tomcat·mybatis
老毛肚17 小时前
Orm框架的发展历史与mybatis的高级应用 01
mybatis
lbb 小魔仙1 天前
MyBatis-Plus 系统化实战:从基础 CRUD 到高级查询与性能优化
java·性能优化·mybatis
tb_first2 天前
SSM速通3
java·jvm·spring boot·mybatis
tb_first2 天前
SSM速通4
java·jvm·spring·tomcat·maven·mybatis
程可爱2 天前
springboot整合mybatis和postgresql
spring boot·postgresql·mybatis