使用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
相关产品推荐
相关产品推荐

