当前位置: 首页 > news >正文

Springboot3整合ehcache3缓存--XML配置和编程式配置

首先,要明确一点,就是EhCache2和EhCache3可以说是完全不同的两个框架了。EhCache2有自己的一套缓存标准API,springboot2的cache部分整合了该API。但是到了EhCache3,并没有自己的API,而是实现了JCache。springboot3中,也不再有EhCacheCacheManager这个可以自动注入的类了。

 Spring Boot 中使用 Ehcache 作为缓存时的 2 种配置方法,分别是 基于 XML 配置 和 基于编程式(代码)配置,下面详细说明:

一、基于 XML 配置(简单方案)

核心思路

通过在类路径下添加 ehcache.xml 配置文件,并在 Spring Boot 中指定该配置文件的位置,让框架自动加载并创建缓存。

具体步骤
  1. 添加依赖
    在 Maven 或 Gradle 中引入 Spring Boot 缓存启动器:

    <!-- Spring Boot 缓存启动器 -->
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
    </dependency><!-- Ehcache 3 与 JCache (JSR-107) 的集成依赖 -->
    <dependency><groupId>org.ehcache</groupId><artifactId>ehcache</artifactId>
    </dependency>
  2. 创建 ehcache.xml 配置文件
    在 src/main/resources 下添加该文件,定义缓存名称和策略:

    <?xml version="1.0" encoding="UTF-8"?>
    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="http://www.ehcache.org/ehcache.xsd"><!--    name="缓存名称"--><cache name="book"maxEntriesLocalHeap="1000"timeToLiveSeconds="300"eternal="false"memoryStoreEvictionPolicy="LRU"></cache></ehcache>
    1. 在 application.yml 中指定配置文件

      spring:cache:# springboot3中type不能写为ehcache,缓存类型不再是EhCache了,EhCache3是实现JCache的一种缓存type: jcachejcache:# xml配置文件地址config: classpath:ehcache.xml
      
    特点
    • 优点:配置集中、直观,适合策略固定的简单场景,无需编写代码。
    • 缺点:灵活性低,无法动态调整配置(如根据环境变量修改缓存大小)。

    二、基于编程式(代码)配置(灵活方案)

    核心思路

    保持和上面的依赖一致,通过 Java 代码手动创建 CacheManager Bean,定义缓存策略并注册到 Spring 容器中。

    代码实现(如用户提供的 CacheConfig.java
    @Configuration
    @EnableCaching
    public class CacheConfig {@Beanpublic CacheManager ehCacheManager() {// 1. 定义缓存配置(键类型、值类型、堆大小等)CacheConfiguration<SimpleKey, String> cacheConfig = CacheConfigurationBuilder.newCacheConfigurationBuilder(SimpleKey.class, String.class, ResourcePoolsBuilder.heap(10)).build();// 2. 获取 Ehcache 的 JCache 缓存管理器javax.cache.CacheManager cacheManager = Caching.getCachingProvider("org.ehcache.jsr107.EhcacheCachingProvider").getCacheManager();// 3. 创建或替换名为 "myCache" 的缓存String cacheName = "myCache";cacheManager.destroyCache(cacheName);  // 先销毁旧缓存(若存在)cacheManager.createCache(cacheName, Eh107Configuration.fromEhcacheCacheConfiguration(cacheConfig));// 4. 包装成 Spring 可用的缓存管理器return new JCacheCacheManager(cacheManager);}
    }
    

    特点
    • 优点:灵活性高,可在代码中动态调整配置(如根据条件设置不同的堆大小、淘汰策略),适合复杂场景。
    • 缺点:代码量稍多,配置逻辑分散在代码中,维护成本略高。

    三、两种方案的对比与选择

    维度XML 配置编程式配置
    实现方式写配置文件,框架自动加载写 Java 代码,手动创建缓存管理器
    灵活性低(静态配置)高(可动态调整策略)
    适用场景简单场景、策略固定不变复杂场景、需要动态调整缓存策略
    维护成本低(配置集中)中(代码逻辑分散)
    与 Spring Boot 版本的兼容性Spring Boot 2/3 均支持(需结合 JCache)Spring Boot 3 推荐(因 Ehcache 3 基于 JCache)

    四、注意事项

    1. 避免配置冲突
      不要同时使用 XML 和编程式配置同一名称的缓存(如同时在 ehcache.xml 和代码中定义 myCache),否则会导致冲突或覆盖。

    2. Spring Boot 3 的变化

      • Spring Boot 3 中,Ehcache 3 基于 JCache 规范,不再支持 Spring Boot 2 中的 EhCacheCacheManager,需通过 JCacheCacheManager 整合(如编程式配置中的实现)。
      • XML 配置时,需通过 spring.cache.jcache.config 指向配置文件,而非直接使用 Ehcache 2 的配置方式。
    3. 缓存未创建的异常
      无论使用哪种配置方式,必须先创建缓存(如 XML 中定义或代码中 createCache),否则 @Cacheable("myCache") 会因找不到缓存而抛出 IllegalArgumentException。

    错误示例:Ehcache -找不到Builder的缓存名称-腾讯云开发者社区-腾讯云

    在文章下面有这样一个回答:@Cacheable(value = "myCache")不会在Ehcache中创建名为myCache的缓存。在运行时,如果一个名为myCache的缓存在Ehcache中可用,它将使用该缓存进行缓存。如果没有,则在运行时尝试缓存时,将引发异常java.lang.IllegalArgumentException: Cannot find cache named 'myCache'。为了让@Cacheable(value = "myCache")使用Ehcache作为后端,需要在某个地方创建缓存,并且需要让Spring知道这个缓存。最简单的方法是包含spring-boot-starter-cache依赖项,将带有Ehcache配置的ehcache.xml添加到类路径中,并在application.yml中设置配置spring.cache.jcache.config: classpath:ehcache.xml。您可以在github上找到这样做的示例应用程序。

    相反,如果您确实希望以编程方式配置Ehcache,则需要一个org.springframework.cache.CacheManager bean来初始化Ehcache配置并将其链接到Spring。bean定义如下所示:

    import javax.cache.Caching;import org.ehcache.config.CacheConfiguration;
    import org.ehcache.config.builders.CacheConfigurationBuilder;
    import org.ehcache.config.builders.ResourcePoolsBuilder;
    import org.ehcache.jsr107.Eh107Configuration;
    import org.springframework.cache.CacheManager;
    import org.springframework.cache.annotation.EnableCaching;
    import org.springframework.cache.interceptor.SimpleKey;
    import org.springframework.cache.jcache.JCacheCacheManager;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;@Configuration
    @EnableCaching
    public class CacheConfig {@Beanpublic CacheManager ehCacheManager() {CacheConfiguration<SimpleKey, String> cacheConfig = CacheConfigurationBuilder.newCacheConfigurationBuilder(SimpleKey.class, String.class, ResourcePoolsBuilder.heap(10)).build();javax.cache.CacheManager cacheManager = Caching.getCachingProvider("org.ehcache.jsr107.EhcacheCachingProvider").getCacheManager();String cacheName = "myCache";cacheManager.destroyCache(cacheName);cacheManager.createCache(cacheName, Eh107Configuration.fromEhcacheCacheConfiguration(cacheConfig));return new JCacheCacheManager(cacheManager);}
    }

    总结

    • 想快速上手、配置简单:选 XML 配置,通过 ehcache.xml 和 application.yml 完成。
    • 想灵活控制、动态配置:选编程式配置,通过代码自定义缓存策略。
    • Spring Boot 3 + Ehcache 3:推荐编程式配置,更符合 JCache 规范的整合方式。
    http://www.dtcms.com/a/265900.html

    相关文章:

  3. 移除 Java 列表中的所有空值
  4. 一天两道力扣(1)
  5. Linux多线程(十二)之【生产者消费者模型】
  6. “Payload document size is larger than maximum of 16793600.“问题解决(MongoDB)
  7. Kettle数据抽取(十一)作业-邮件
  8. 什么是码率?剪映中如何选择适合的视频码率
  9. C++(std::sort)
  10. js-cookie详细介绍
  11. Node.js与Webpack
  12. 2025年6月:技术探索与生活平衡的协奏曲
  13. 目标检测:从基础原理到前沿技术全面解析
  14. 架构师的“降维打击”:用桥接模式,把 N*M 的问题变成 N+M
  15. Matplotlib 安装使用教程
  16. 【Git】同时在本地使用多个github账号进行github仓库管理
  17. C++ 网络编程(14) asio多线程模型IOThreadPool
  18. 【数据结构】树的基本操作
  19. 阿里云服务网格ASM实践
  20. 抗辐照芯片在核电厂火灾探测器中的应用优势与性能解析
  21. springMvc的简单使用:要求在浏览器发起请求,由springMVC接受请求并响应,将个人简历信息展示到浏览器
  22. Java 原生 HTTP Client
  23. https如何利用工具ssl证书;使用自己生成的证书
  24. http、SSL、TLS、https、证书
  25. 【交互设计】UI 与 UX 简介:从核心概念到行业实践
  26. 微算法科技(NASDAQ MLGO)基于量子图像处理的边缘检测算法:开拓图像分析新视野
  27. [2025CVPR]SEEN-DA:基于语义熵引导的领域感知注意力机制
  28. 通过观看数百个外科手术视频讲座来学习多模态表征|文献速递-最新论文分享
  29. 【数据结构】哈希——闭散列/开散列模拟实现(C++)
  30. [论文阅读] 人工智能 | 在非CUDA硬件上运行几何学习:基于Intel Gaudi-v2 HPU的PyTorch框架移植实践
  31. Stable Diffusion 项目实战落地:AI照片修复 第一篇 从黑白到彩色:用AI给照片上色的魔法之旅
  32. stm32f103c8t6---ymodem协议串口IAP升级(只教怎么操作,略讲原理,100%成功!)