Spring中@Cacheable注解的value与cacheName参数区别咨询
嘿,作为Spring缓存的新手,搞懂这俩参数确实容易懵——我刚接触Spring缓存的时候也纠结过!其实说穿了,这俩参数本质上是完全等价的别名关系,功能没有任何区别,只是名字不同而已。
下面给你拆解一下来龙去脉和注意点:
核心关系:互为别名
在Spring的缓存注解体系里,value和cacheNames是同一个底层属性的两个不同名字。意思就是,你用value = "myCache"或者cacheNames = "myCache",最终都会把结果缓存到名为myCache的缓存实例里,效果100%一致。为什么会有两个参数?版本演进的兼容性考虑
早期的Spring缓存注解(比如Spring 4.3之前)只有value参数,用来指定缓存名称。后来Spring团队觉得value这个名字太宽泛了,不够语义化——新接触的开发者可能会疑惑这个参数到底用来干嘛?于是在Spring 4.3版本引入了cacheNames这个更直观的名字,同时保留value作为别名,这样老项目的代码不需要修改就能兼容新版本,不会出现编译错误。代码示例:两种写法效果完全相同
用value的写法:@Cacheable(value = "userCache") public User getUserById(Long userId) { // 从数据库查询用户的逻辑 return userRepository.findById(userId).orElse(null); }用
cacheNames的写法:@Cacheable(cacheNames = "userCache") public User getUserById(Long userId) { // 完全一样的查询逻辑 return userRepository.findById(userId).orElse(null); }注意:不能同时指定两个参数
如果你尝试同时设置value和cacheNames,比如@Cacheable(value = "a", cacheNames = "b"),Spring会直接抛出异常,因为它们指向同一个底层属性,不能同时赋值。扩展:其他缓存注解也遵循这个规则
不光是@Cacheable,@CacheEvict、@CachePut这些常用的缓存注解,都同时提供了value和cacheNames这两个别名参数,规则完全一致。
总结一下:选哪个参数都可以,完全看个人或者团队的编码习惯。如果是新手,我更推荐用cacheNames,因为名字更清晰,看到参数名就知道是用来指定缓存名称的,可读性更强~
内容的提问来源于stack exchange,提问作者Prasanna

