Spring Cache通过声明式注解简化缓存开发,基于AOP自动拦截方法调用实现缓存逻辑;需引入spring-boot-starter-cache依赖并添加@EnableCaching注解;支持@Cacheable、@CachePut、@CacheEvict、@Caching等注解及key、condition、unless、sync等配置。

Spring Cache 通过声明式注解大幅简化缓存逻辑开发,无需手写 put/get/evict 代码,也不用侵入业务方法。核心是利用 AOP 在运行时自动拦截方法调用,根据注解行为决定是否查缓存、存结果或清旧数据。
开启缓存支持
在 Spring Boot 项目中只需两步:
- 引入依赖:
spring-boot-starter-cache(若用 Redis 还需spring-boot-starter-data-redis) - 在启动类上添加 @EnableCaching 注解
常用注解与典型用法
每个注解对应明确语义,按操作类型对齐业务场景:
-
@Cacheable:用于查询方法。首次调用执行方法并缓存结果;后续相同参数调用直接返回缓存值。
例:@Cacheable(cacheNames = "user", key = "#id") public User findById(Long id) -
@CachePut:强制执行方法,并把返回值更新进缓存(适合修改后同步刷新)。
例:@CachePut(cacheNames = "user", key = "#user.id") public User update(User user) -
@CacheEvict:执行方法后清除缓存(可清单个 key、整个 cache 或全部缓存)。
例:@CacheEvict(cacheNames = "user", key = "#id") public void delete(Long id)或@CacheEvict(cacheNames = "user", allEntries = true) -
@Caching:组合多个缓存动作。如更新用户同时清除关联的列表缓存:
@Caching(evict = {@CacheEvict("user"), @CacheEvict(value = "userList", allEntries = true)})
关键配置细节
实际使用中几个属性最常调整:
立即学习“Java免费学习笔记(深入)”;
-
key:支持 SpEL 表达式,如
#id、#p0(第一个参数)、#result.name(返回值字段) -
condition:控制是否缓存,例如
condition = "#id > 0" -
unless:控制“不缓存”的情形,例如
unless = "#result == null" - sync = true:防止缓存击穿,对同一 key 的并发请求只放行一个线程执行方法,其余等待结果
注意作用域与限制
缓存注解生效有前提条件:
- 必须是 Spring 管理的 Bean 中的 public 方法
- 不能在类内部直接调用(this.xxx()),否则 AOP 代理失效,注解不触发
- 单机环境可用本地缓存(如 ConcurrentMapCache),集群部署建议搭配 Redis 等分布式缓存
- 可通过 @CacheConfig 在类级别统一设置
cacheNames、keyGenerator等公共配置,避免重复声明


















