@Cacheable 是 Spring 提供的一个非常重要的注解,用于实现 方法级别的缓存。它属于 org.springframework.cache.annotation.Cacheable 包,是 Spring 缓存抽象(Spring Cache Abstraction)的一部分。

作用简述:
@Cacheable 注解的作用是:将方法的返回值缓存起来,当下次调用相同参数的方法时,直接从缓存中获取结果,而不再执行方法体本身。
这在处理一些 计算耗时、查询数据库或远程接口等开销较大的操作 时非常有用,可以显著提升系统性能。

✅ 使用前提
要使用 @Cacheable 注解,需要满足以下条件:
• 启用缓存功能
:
在 Spring Boot 主启动类上加上:
Java
深色版本


@EnableCaching
• 引入缓存实现依赖
:
比如你使用 Ehcache、Caffeine、Guava、Redis 等作为缓存提供者,需添加对应的依赖。
• 被注解的方法必须是 public 的,因为 Spring 是通过 AOP 动态代理来实现缓存逻辑的。

常用属性说明
属性名
类型
说明
value 或 cacheNames
String[]
缓存的名称,用来指定将数据存储到哪个缓存中(必填)
key
String
自定义缓存键的生成规则,默认使用方法参数自动生成
condition
String
条件判断表达式,只有当表达式为 true 时才缓存结果
unless
String
条件判断表达式,如果为 true,则不将结果放入缓存
keyGenerator
KeyGenerator
自定义缓存键生成器
cacheManager
String
指定使用的缓存管理器(适用于多缓存配置)

示例代码
示例 1:最简单用法(默认 key)
Java
深色版本


import
org.springframework.cache.annotation.Cacheable;
import
org.springframework.stereotype.Service;
@Service
public class UserService
{
@Cacheable("users") // 将结果缓存到名为 "users" 的缓存中
public User getUserById(Long id)
{
System.out.println("从数据库加载用户:"
+ id);
return new User(id, "用户"
+ id);
}
}
第一次调用:
Java
深色版本


userServie.getUserById(1L); // 输出:从数据库加载用户:1
第二次调用:
Java
深色版本


userServie.getUserById(1L); // 不输出,直接从缓存取

示例 2:自定义 key 和条件缓存
Java
深色版本


@Cacheable(
cacheNames = "users",
key = "#id", // 使用 id 作为缓存 key
condition = "#id > 0", // 只有当 id > 0 时才缓存
unless = "#result == null" // 如果返回 null,不缓存
)
public User getUserById(Long id)
{
System.out.println("从数据库加载用户:"
+ id);
return
userRepository.findById(id);
}

示例 3:使用 SpEL 表达式定义 key
Java
深色版本


@Cacheable(cacheNames = "users", key = "#root.methodName + #id")
public User getUserById(Long id)
{
// 方法名为 getUserById,所以 key = "getUserById1"
return
loadUserFromDB(id);
}

缓存更新和删除
除了 @Cacheable,Spring 还提供了其他几个配合使用的注解:
• @CachePut:执行方法并更新缓存,适合新增/更新操作。
• @CacheEvict:清除缓存,适合删除操作。
例如:
Java
深色版本


@CachePut(cacheNames = "users", key = "#user.id")
public User updateUser(User user)
{
return
userDao.update(user);
}
@CacheEvict(cacheNames = "users", key = "#id")
public void deleteUser(Long id)
{
userDao.delete(id);
}

️ 配置缓存管理器(以 Ehcache 为例)
如果你使用的是 Ehcache,可以在 application.yml 中这样配置:
Yaml
深色版本


spring:
cache:
ehcache:
config: classpath:ehcache.xml
并在 src/main/resources/ 下创建 ehcache.xml 文件定义缓存策略。

总结
特性
说明
注解来源
org.springframework.cache.annotation.Cacheable
作用
对方法的结果进行缓存,避免重复执行
底层机制
Spring AOP 动态代理
支持的缓存实现
Ehcache、Caffeine、Guava、Redis、ConcurrentMap 等
其他相关注解
@CachePut, @CacheEvict, @EnableCaching
注意事项
方法必须是 public,参数最好可序列化(尤其是使用 Redis 时)

如果你正在开发一个需要频繁访问数据库或执行高成本运算的 Spring Boot 项目,合理使用 @Cacheable 能极大提升应用性能和用户体验。如需更高级用法(比如多级缓存、分布式缓存),可以结合 Redis 或 Caffeine 等工具进一步扩展。
如有更多关于 Spring Cache 的问题,欢迎继续提问!