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 缓存启动器:

    XML 复制代码
    <!-- 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 复制代码
    <?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>
  3. 在 application.yml 中指定配置文件

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

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

核心思路

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

代码实现(如用户提供的 CacheConfig.java
java 复制代码
@Configuration
@EnableCaching
public class CacheConfig {
    @Bean
    public 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定义如下所示:

java 复制代码
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 {

    @Bean
    public 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.xmlapplication.yml 完成。
  • 想灵活控制、动态配置:选编程式配置,通过代码自定义缓存策略。
  • Spring Boot 3 + Ehcache 3:推荐编程式配置,更符合 JCache 规范的整合方式。
相关推荐
2601_963870189 小时前
【计算机毕业设计】基于Spring Boot的宠物领养救助平台的设计与实现
spring boot·课程设计·宠物
凤山老林11 小时前
高保真集成测试:Spring Boot 结合 Testcontainers 的工程落地
spring boot·后端·集成测试
RuoyiOffice12 小时前
SpringBoot3+Vue3 接口访问日志实战:@ApiAccessLog 慢接口、参数脱敏与 OperateLog 如何分工
spring boot·vue3·traceid·spring boot 3·访问日志·apiaccesslog·操作日志
林三的日常12 小时前
【无标题】
java·spring boot·vscode·调试·后端开发
counting money13 小时前
SpringBoot 项目创建(IDEA不全,还需要修改)
java·spring boot·spring·maven
阿部多瑞 ABU13 小时前
从0到1:用 Spring Boot 3.4 + Vue3 做一个能“智能排道次“的运动会编排系统(附核心算法)
java·spring boot·后端·算法·spring
MacroZheng13 小时前
几行代码给项目集成AI功能,Spring AI 2.0太香了!
java·人工智能·spring boot
野生技术架构师13 小时前
Redis 和 MySQL 如何保证数据一致性?先更新数据库还是先删缓存,延迟双删、MQ、Canal 一次讲透
数据库·redis·缓存
元界metalite13 小时前
SpringBoot修改接口全字段更新为什么危险-MetaLite如何只更新变化字段
spring boot
Devin~Y13 小时前
从内容社区到AI智能客服:Spring Boot + Spring Cloud + Spring AI 全栈实战面试拆解
java·spring boot·redis·elasticsearch·spring cloud·kafka·mybatis