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