是否有可能讓Spring的緩存抽象填充與給定項目的緩存,而不是隻有它的通讀?春季緩存更新
想象一下,我有方法Thing getItem(UUID id)
和setItem(UUID id, Thing thing)
。我想對前者使用@Cacheable
以使其從緩存中讀取,如果沒有,則調用底層方法。調用setter時,我想將參數thing
添加到緩存中,然後調用該方法,並將其保存到底層存儲。
是否有可能讓Spring的緩存抽象填充與給定項目的緩存,而不是隻有它的通讀?春季緩存更新
想象一下,我有方法Thing getItem(UUID id)
和setItem(UUID id, Thing thing)
。我想對前者使用@Cacheable
以使其從緩存中讀取,如果沒有,則調用底層方法。調用setter時,我想將參數thing
添加到緩存中,然後調用該方法,並將其保存到底層存儲。
由於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
}
我不認爲它能夠做到這一點。它只是讓您通過@Cachable
定義要緩存的實例,並通過@CacheEvict
刪除它們。據我所知,沒有其他辦法可以干預這一工作機制。 您也可以定義自定義註釋以實現相同的功能。
我回答你的問題與「CachePut」,但看着http://static.springsource.org/spring/docs/3.1.x/ spring-framework-reference/html/cache.html#cache-annotations-讓你必須返回「thing」才能工作。我想更好的答案是用「CacheEvict」註釋setItem,以便從緩存中刪除舊值。下一次調用getItem時,它將填充新值。 – Luciano