当前位置: 首页 > 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.lryc.cn/news/579425.html

    相关文章:

  3. 【PyCharm 2025.1.2配置debug】
  4. 【vmware虚拟机使用】 开始安装centos7操作系统
  5. Navicat Premium 12连接Oracle时提示oracle library is not loaded的问题解决
  6. 分布式部署下如何做接口防抖---使用分布式锁
  7. macOS 26正式发布,全新Liquid Glass设计语言亮相
  8. 旅游管理实训室:支撑实践教学的核心载体
  9. 5118 API智能处理采集数据教程
  10. 项目——视频共享系统测试
  11. 【C++】状态模式
  12. GitHub 解码指南:用 AI 赋能,五步快速掌握任意开源项目
  13. MySQL 8.0 OCP 1Z0-908 题目解析(20)
  14. MVC 架构设计模式
  15. 【Linux仓库】进程优先级及进程调度【进程·肆】
  16. 小黑黑日常积累大模型prompt句式2:【以段落的形式输出,不分点列举】【如果没有相关内容则不输出】【可读性强】【输出格式规范】
  17. Java学习第八部分——泛型
  18. git 中删除提交历史
  19. 代码随想录算法训练营第四十五天|动态规划part12
  20. Fiddler中文版抓包工具在后端API调试与Mock中的巧用
  21. 应用在核电行业的虚拟现实解决方案
  22. Laravel8中调取腾讯云文字识别OCR
  23. 【前端开发】Uniapp分页器:新增输入框跳转功能
  24. SpringCloud系列(49)--SpringCloud Stream消息驱动之实现生产者
  25. Rubber Band Algorithm 应力及反作用力测试
  26. 运维打铁: 企业运维开发痛点之解决方案
  27. ModuleNotFoundError: No module named ‘onnxruntime‘
  28. 【免费.NET方案】CSV到PDF与DataTable的快速转换
  29. 图论基础算法入门笔记
  30. MySQL 8.0 OCP 1Z0-908 题目解析(18)
  31. 深度学习2(逻辑回归+损失函数+梯度下降)
  32. 在 VSCode 中高效配置自定义注释模板 (无需插件)