原創(chuàng)性聲明:本文完全為筆者原創(chuàng)房交,請(qǐng)尊重筆者勞動(dòng)力抗楔。轉(zhuǎn)載務(wù)必注明原文地址。
@Cacheable 是一個(gè)既可以應(yīng)用于方法級(jí)別朝巫,也可用于類級(jí)別的注解。自spring3.1開始就通過它實(shí)現(xiàn)了緩存管理石景。
@Cacheable
能干什么劈猿?
為了通俗易懂的理解,舉個(gè)栗子:一個(gè)方法,getBooksByUsernameAndLanguage(String username, int language)
潮孽,顯然揪荣,是一個(gè)獲取數(shù)據(jù)庫里所有我的英文書對(duì)象的方法,返回應(yīng)該是一個(gè)列表往史。如果這個(gè)函數(shù)的返回值很大仗颈,而且會(huì)在頁面上被經(jīng)常調(diào)用,那么每一次調(diào)用都要重新連接數(shù)據(jù)庫并返回一個(gè)數(shù)據(jù)量龐大的list怠堪,可能頁面響應(yīng)和資源占用會(huì)比較大揽乱。而我們希望的是,第一次調(diào)用這個(gè)方法時(shí)粟矿,返回的數(shù)據(jù)能被放到服務(wù)器端的緩存里凰棉,以便于后面要調(diào)用這個(gè)方法時(shí),能直接從緩存里取到陌粹,這樣就不用再查數(shù)據(jù)庫占用資源了撒犀。而@Cacheable
的作用就是這個(gè)。@Cacheable
怎么用掏秩?
舉個(gè)栗子(我就喜歡直接上代碼或舞,簡單粗暴):
@Cacheable(value = "CACHE_BOOK",key = "#username", condition = "#language = 1")
public List<Book> getBooksByUsernameAndLanguage(String username, int language) {
// balabalabala...里面的代碼不重要
return bookList;
}
看code,@Cacheable
注解只有三個(gè)屬性蒙幻。
- value : 必須要的映凳。就是個(gè)自己取的名字,通過它指明了第一次調(diào)用這個(gè)方法時(shí)返回的bookList將被存在內(nèi)存的哪里邮破。
- key : 可選诈豌。要使用SpEL表達(dá)式,這里與參數(shù)
username
對(duì)應(yīng)抒和,當(dāng)傳入的username值變了的話就不去取緩存里的數(shù)據(jù)了矫渔,而是執(zhí)行getBooksByUsernameAndLanguage
方法。(這是必須的摧莽,因?yàn)閡sername變了庙洼,返回值也就變了,緩存里的數(shù)據(jù)不符合了,因此這個(gè)選項(xiàng)很重要)油够。spring默認(rèn)用方法的簽名來當(dāng)做key蚁袭。 - condition:方法返回的結(jié)果bookList,要不要緩存起來叠聋?condition就添加了一個(gè)限定條件撕阎。這個(gè)例子中,只有傳入的語言代碼是1碌补,返回的bookList才會(huì)被緩存起來,如果給language傳了別的值棉饶,那么bookList是不會(huì)緩存起來的厦章。
下次再遇到頁面刷新后數(shù)據(jù)還不更新的問題時(shí),記得看看是不是@Cacheable
搞的鬼照藻。
補(bǔ)充: 事實(shí)上袜啃,第二次調(diào)用方法時(shí),spring會(huì)在執(zhí)行
getBooksByUsernameAndLanguage
方法前先去緩存里看是否有相應(yīng)的數(shù)據(jù)幸缕,有群发,則不會(huì)執(zhí)行方法。沒有发乔,才執(zhí)行熟妓。