原創性聲明:本文完全為筆者原創,請尊重筆者勞動力。轉載務必注明原文地址。
@Cacheable 是一個既可以應用于方法級別,也可用于類級別的注解。自spring3.1開始就通過它實現了緩存管理。
@Cacheable
能干什么?
為了通俗易懂的理解,舉個栗子:一個方法,getBooksByUsernameAndLanguage(String username, int language)
,顯然,是一個獲取數據庫里所有我的英文書對象的方法,返回應該是一個列表。如果這個函數的返回值很大,而且會在頁面上被經常調用,那么每一次調用都要重新連接數據庫并返回一個數據量龐大的list,可能頁面響應和資源占用會比較大。而我們希望的是,第一次調用這個方法時,返回的數據能被放到服務器端的緩存里,以便于后面要調用這個方法時,能直接從緩存里取到,這樣就不用再查數據庫占用資源了。而@Cacheable
的作用就是這個。@Cacheable
怎么用?
舉個栗子(我就喜歡直接上代碼,簡單粗暴):
@Cacheable(value = "CACHE_BOOK",key = "#username", condition = "#language = 1")
public List<Book> getBooksByUsernameAndLanguage(String username, int language) {
// balabalabala...里面的代碼不重要
return bookList;
}
看code,@Cacheable
注解只有三個屬性。
- value : 必須要的。就是個自己取的名字,通過它指明了第一次調用這個方法時返回的bookList將被存在內存的哪里。
- key : 可選。要使用SpEL表達式,這里與參數
username
對應,當傳入的username值變了的話就不去取緩存里的數據了,而是執行getBooksByUsernameAndLanguage
方法。(這是必須的,因為username變了,返回值也就變了,緩存里的數據不符合了,因此這個選項很重要)。spring默認用方法的簽名來當做key。 - condition:方法返回的結果bookList,要不要緩存起來?condition就添加了一個限定條件。這個例子中,只有傳入的語言代碼是1,返回的bookList才會被緩存起來,如果給language傳了別的值,那么bookList是不會緩存起來的。
下次再遇到頁面刷新后數據還不更新的問題時,記得看看是不是@Cacheable
搞的鬼。
補充: 事實上,第二次調用方法時,spring會在執行
getBooksByUsernameAndLanguage
方法前先去緩存里看是否有相應的數據,有,則不會執行方法。沒有,才執行。