2

是否可以让 Spring 的缓存抽象用给定的项目填充缓存,而不仅仅是让它通读?

想象一下我有方法Thing getItem(UUID id)setItem(UUID id, Thing thing). 我想@Cacheable在前者上使用它来从缓存中读取它,如果它不存在,则调用底层方法。调用 setter 时,我希望将参数thing添加到缓存中,然后调用该方法,将其持久化到底层存储中。

4

2 回答 2

1

我不认为它有能力做到这一点。它只允许您定义要通过缓存的实例并通过@Cachable删除它们@CacheEvict。据我所知,没有其他方法可以干扰这种工作机制。您还可以定义自定义注释来实现相同的功能。

于 2013-06-19T14:51:00.900 回答
1

正如 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
}
于 2013-06-19T15:49:42.823 回答