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 中指定该配置文件的位置,让框架自动加载并创建缓存。
具体步骤
-
添加依赖
在 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>
-
创建
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>
-
在 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) |
四、注意事项
-
避免配置冲突:
不要同时使用 XML 和编程式配置同一名称的缓存(如同时在ehcache.xml
和代码中定义myCache
),否则会导致冲突或覆盖。 -
Spring Boot 3 的变化:
- Spring Boot 3 中,Ehcache 3 基于 JCache 规范,不再支持 Spring Boot 2 中的
EhCacheCacheManager
,需通过JCacheCacheManager
整合(如编程式配置中的实现)。 - XML 配置时,需通过
spring.cache.jcache.config
指向配置文件,而非直接使用 Ehcache 2 的配置方式。
- Spring Boot 3 中,Ehcache 3 基于 JCache 规范,不再支持 Spring Boot 2 中的
-
缓存未创建的异常:
无论使用哪种配置方式,必须先创建缓存(如 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 规范的整合方式。