concurrentmapcache 是 spring cache 对 concurrenthashmap 的直接语义桥接实现,底层持有一个 concurrentmap 实例,所有缓存操作(get/put/evict/clear)均委托给该 map 执行,无额外逻辑或中间层,严格遵循 cache 接口契约,支持 null 值可配置处理,不提供过期、淘汰等高级功能,专用于轻量级、无依赖的本地缓存场景。

ConcurrentMapCache 是 Spring Cache 抽象层中对 java.util.Map 最直接的桥接实现——它不是“包装”或“模拟”Map,而是**以 ConcurrentMap 为底座,严格遵循 Cache 接口契约,将 Map 的能力映射为缓存语义**。
底层就是 ConcurrentMap 实例
ConcurrentMapCache 内部持有一个 ConcurrentMap<object object></object>(通常是 ConcurrentHashMap),所有操作(get/put/evict/clear)都委托给该 Map 执行。它没有额外的数据结构或中间层,也没有序列化、过期、监听等复杂逻辑,纯粹是 Map 操作到缓存行为的语义翻译:
-
put(key, value) → 对应
cache.put(key, value),直接写入 ConcurrentMap -
get(key) → 对应
cache.get(key),调用map.get(key),返回Cache.ValueWrapper包装结果 -
evict(key) → 对应
cache.evict(key),即map.remove(key) -
clear() → 对应
cache.clear(),即map.clear()
null 值处理与 Map 约束保持一致
ConcurrentMapCache 默认允许缓存 null 值(通过构造参数 allowNullValues=true 控制),这与其底层 ConcurrentMap 行为一致:ConcurrentHashMap 不允许 null 键或 null 值,但 ConcurrentMapCache 会主动拦截并抛出异常,避免歧义。它把 Map 的约束显式转化为缓存契约:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 键为
null→ 直接拒绝,抛IllegalArgumentException - 值为
null→ 若禁用null值,则包装为NullValue占位对象存入 Map,保证「键存在」与「值为 null」可区分 - 这样既兼容 Map 的线程安全语义,又规避了缓存场景下「查不到 vs 查到 null」的二义性
Cache 接口方法与 Map 方法的一一映射
Spring Cache 的 Cache 接口定义了标准缓存行为,而 ConcurrentMapCache 的每个方法都精准对应 Map 的原生能力:
-
get(Object key, Class<t> type)</t>→ 先map.get(key),再做类型校验和转换 -
put(Object key, Object value)→ 先检查是否允许null值,再map.put(key, value) -
putIfAbsent(Object key, Object value)→ 直接调用map.putIfAbsent(key, value),利用底层 CAS 保证原子性 -
getNativeCache()→ 直接返回内部持有的ConcurrentMap实例,方便开发者直连操作
不引入新语义,只做语义适配
它不提供过期、淘汰、统计、事件通知等功能——这些属于更高阶缓存(如 Caffeine、RedisCache)的职责。它的存在意义在于:
- 让 Spring Cache 能在无外部依赖时立即工作(开发/测试环境开箱即用)
- 作为参考实现,清晰展示 Cache 接口如何与 Java 原生并发集合对接
- 成为 CacheManager(如 ConcurrentMapCacheManager)动态创建缓存的默认模板
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










