You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Ehcache时未在XML中定义对应缓存为何仍能正常工作?

问题1:Ehcache是否会自动创建未配置的缓存?

是的,这是Ehcache集成Spring Cache时的默认行为:当你使用@Cacheable指定的缓存名称不存在时,Spring Cache抽象层会默认触发缓存管理器自动创建对应名称的缓存实例,无需提前在XML中预定义。

问题2:自动创建的缓存使用什么配置?

自动生成的缓存配置优先级如下:

  • 优先继承你在XML中定义的<jsr107:defaults>全局默认配置,你当前配置中全局开启的enable-statistics="true"会生效
  • 未在全局默认配置中指定的参数,使用Ehcache内置默认值,核心默认项包括:
    • 过期策略:永不过期
    • 堆内存容量:最多存储1000个条目
    • 无堆外内存、磁盘存储配置
    • 不会自动添加你自定义的CacheLogger监听器
    • 键值类型默认为Object,无强制类型校验

问题3:查看所有已创建缓存的方式

你可以通过以下几种方式获取所有已创建的缓存信息:

  • 代码直接查询:注入Spring的CacheManager实例,调用getCacheNames()方法即可获取所有缓存名称,如需查看详细配置可将实例强转为Ehcache的实现类读取参数,示例代码如下:
import org.springframework.cache.CacheManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;

@Component
public class CacheInfoPrinter {
    @Autowired
    private CacheManager cacheManager;

    @PostConstruct
    public void printAllCaches() {
        System.out.println("已创建的缓存列表:");
        cacheManager.getCacheNames().forEach(cacheName -> {
            System.out.println("- " + cacheName);
            // 如需获取具体配置可打开下方注释
            // EhcacheCache ehcacheCache = (EhcacheCache) cacheManager.getCache(cacheName);
            // Configuration config = ehcacheCache.getNativeCache().getRuntimeConfiguration();
        });
    }
}
  • JMX工具查询:你已开启缓存统计,默认会暴露JMX端点,使用JConsole、VisualVM等工具连接应用进程,在MBean面板中找到Ehcache对应的节点,即可查看所有缓存的配置、运行指标数据。
  • Spring Boot Actuator查询:如果你使用Spring Boot开发,引入Actuator依赖并开启caches端点,访问/actuator/caches即可直接获取所有缓存的结构化详细信息。

补充说明:如果你不希望Ehcache自动创建未预定义的缓存,可在XML的根<config>标签中添加dynamic-cache="false"属性,后续使用不存在的缓存名称时会直接抛出异常,避免误生成不符合预期的缓存实例。

内容的提问来源于stack exchange,提问作者user16613329

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 20:15:03