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

相关推荐
C++chaofan3 小时前
MyBatis - Plus学习笔记
java·spring boot·笔记·后端·mysql·架构·mybatis
只因在人海中多看了你一眼1 天前
B.40.3.2-MyBatis核心技术详解与性能优化
性能优化·mybatis
.又是新的一天.1 天前
健身房预约系统SSM+Mybatis(五、预约展示)
前端·mybatis
北城以北88881 天前
SSM--MyBatis框架之动态SQL
java·开发语言·数据库·sql·mybatis
计算机学姐1 天前
基于SpringBoot的公务员考试管理系统【题库组卷+考试练习】
java·vue.js·spring boot·后端·java-ee·intellij-idea·mybatis
刘一说2 天前
深入解析 Spring Boot 数据访问:Spring Data JPA 与 MyBatis 集成实战
spring boot·tomcat·mybatis
赋能大师兄2 天前
MyBatis缓存机制
mybatis·二级缓存·一级缓存
codingPower3 天前
升级mybatis-plus导致项目启动报错: net.sf.jsqlparser.statement.select.SelectBody
java·spring boot·maven·mybatis
123461614 天前
互联网大厂Java面试:从Spring Boot到微服务的探索
java·数据库·spring boot·微服务·面试·mybatis·orm
2301_801252224 天前
Mybatis的添加和修改功能
java·开发语言·mybatis