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 规范的整合方式。
相关推荐
Java初学者小白36 分钟前
秋招Day15 - Redis - 缓存设计
java·数据库·redis·缓存
代码老y1 小时前
Spring Boot + 本地部署大模型实现:安全性与可靠性保障
spring boot·后端·bootstrap
RainbowSea2 小时前
补充:问题:CORS ,前后端访问跨域问题
java·spring boot·spring
paopaokaka_luck5 小时前
基于SpringBoot+Vue的电影售票系统(协同过滤算法)
vue.js·spring boot·后端
工一木子8 小时前
URL时间戳参数深度解析:缓存破坏与前端优化的前世今生
前端·缓存
陌殇殇8 小时前
SpringBoot整合SpringCache缓存
spring boot·redis·缓存
小林学习编程11 小时前
Springboot + vue + uni-app小程序web端全套家具商场
前端·vue.js·spring boot
ladymorgana11 小时前
【Spring boot】tomcat Jetty Undertow对比,以及应用场景
spring boot·tomcat·jetty
IT_102411 小时前
Spring Boot项目开发实战销售管理系统——系统设计!
大数据·spring boot·后端
DCTANT12 小时前
【原创】国产化适配-全量迁移MySQL数据到OpenGauss数据库
java·数据库·spring boot·mysql·opengauss