@Cacheable(value = "CACHE_BOOK",key = "#username", condition = "#language = 1") public List<Book> getBooksByUsernameAndLanguage(String username, int language) { // balabalabala...里面的代碼不重要 return bookList; }
@Cacheable
注解只有三個屬性。
- value : 必須要的。就是個自己取的名字,通過它指明了第一次調用這個方法時返回的bookList將被存在內存的哪里。
- key : 可選。要使用SpEL表達式,這里與參數
username
對應,當傳入的username值變了的話就不去取緩存里的數據了,而是執行getBooksByUsernameAndLanguage
方法。(這是必須的,因為username變了,返回值也就變了,緩存里的數據不符合了,因此這個選項很重要)。spring默認用方法的簽名來當做key。 - condition:方法返回的結果bookList,要不要緩存起來?condition就添加了一個限定條件。這個例子中,只有傳入的語言代碼是1,返回的bookList才會被緩存起來,如果給language傳了別的值,那么bookList是不會緩存起來的。


注意事項:1、@Cacheable必須開啟緩存在啟動類上@EnableCaching
2、返回的對象要實現緩存該對象是必須實現序列化接口的Serializable
3、@Cacheable不可用在私有方法上面,可以放在接口和具體的方法上面
4、@Cacheable這個注解是放在具體的方法上;
5、@CacheConfig這個注解只能放在類上代表這個類所有緩存的公共屬性配置,比如value等非必須;
6、key = "#對象.屬性"或者直接使用key = "#屬性";直接讀取的是方法形參內的參數屬性或者對象;
7、key = "#對象.屬性.concat('Hydrologydata')"