Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring缓存更新_Java_Spring_Caching - Fatal编程技术网

Java Spring缓存更新

Java Spring缓存更新,java,spring,caching,Java,Spring,Caching,有没有可能让Spring的缓存抽象用给定的项填充缓存,而不是让它通读 假设我有方法Thing-getItem(UUID-id)和setItem(UUID-id,Thing-Thing)。我想在前者上使用@Cacheable从缓存中读取它,如果没有,则调用底层方法。调用setter时,我希望将参数thing添加到缓存中,然后调用该方法,将其持久化到底层存储。我认为它无法做到这一点。它只允许您通过@Cachable定义要缓存的实例,并通过@cacheexecute删除它们。据我所知,没有其他办法干扰

有没有可能让Spring的缓存抽象用给定的项填充缓存,而不是让它通读


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

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

正如Luciano所述,您可以在方法上设置@CachePut注释,但正如他所说,这将导致您修改API。不过,这可能是一个优势,这取决于您是否喜欢使用fluid 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
}

我用“CachePut”来回答你的问题,但是看着你,你必须返回“thing”才能让它工作。我想更好的答案是用“cacheexecute”注释setItem,这样它就可以从缓存中删除旧值。下次调用getItem时,将使用新值填充它。