是否可以让 Spring 的缓存抽象用给定的项目填充缓存,而不仅仅是让它通读?
想象一下我有方法Thing getItem(UUID id)
和setItem(UUID id, Thing thing)
. 我想@Cacheable
在前者上使用它来从缓存中读取它,如果它不存在,则调用底层方法。调用 setter 时,我希望将参数thing
添加到缓存中,然后调用该方法,将其持久化到底层存储中。
我不认为它有能力做到这一点。它只允许您定义要通过缓存的实例并通过@Cachable
删除它们@CacheEvict
。据我所知,没有其他方法可以干扰这种工作机制。您还可以定义自定义注释来实现相同的功能。
正如 Luciano 所说,您可以在方法上设置 @CachePut 注释,但正如他所说,这将导致您修改 API。不过,这可能是一个优势,这取决于您是否喜欢通过流式 API 样式接收到的语义。
虽然您有另一个选择,但它会将您绑定到 Spring,并导致您的 setItem 代码有点讨厌。您始终可以连接到 CacheManager 并在 setItem 方法中设置缓存本身的数据。
所以它看起来像这样:
@Autowire private CacheManager cacheManager;
public void setItem(UUID id, Thing thing) {
Cache c = cacheManager.getCache("cacheName");
if (c != null) {
c.put(id, thing);
}
//Do more
}