package com.roncoo.example.cache.impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Repository; import com.roncoo.example.bean.RoncooUserLog; import com.roncoo.example.cache.RoncooUserLogCache; import com.roncoo.example.dao.RoncooUserLogDao; /** * @author wei.liu */ @CacheConfig(cacheNames = "roncooCache") @Repository public class RoncooUserLogCacheImpl implements RoncooUserLogCache { @Autowired private RoncooUserLogDao roncooUserLogDao; @Cacheable(key = "#p0") @Override public RoncooUserLog selectById(Integer id) { System.out.println("查詢功能,緩存找不到,直接讀庫, id=" + id); return roncooUserLogDao.findOne(id); } @CachePut(key = "#p0") @Override public RoncooUserLog updateById(RoncooUserLog roncooUserLog) { System.out.println("更新功能,更新緩存,直接寫庫, id=" + roncooUserLog); return roncooUserLogDao.save(roncooUserLog); } @CacheEvict(key = "#p0") @Override public String deleteById(Integer id) { System.out.println("刪除功能,刪除緩存,直接寫庫, id=" + id); return "清空緩存成功"; } }
一、@Cacheable:主要用來配置方法,可以根據方法的請求參數對其結果進行緩存。即當重複使用相同參數調用方法的時候,方法自己不會被調用執行,即方法自己被略過了,取而代之的是方法的結果直接從緩存中找到並返回了。spring
參數介紹:緩存
value:緩存的名字,必須指定至少一個。ide
key:緩存的key,能夠爲空,若是指定要按照SpEL表達式編寫;若是不指定,則缺省按照方法的全部參數進行組合。code
condition:緩存的條件,能夠爲空,使用SpEL編寫,返回true或者false,只有爲true才能緩存。get
例子:it
@Cacheable(value="shops:detail",key="'id:'+#p0") public Shop getById(String id);
二、@CacheEvict:主要對方法配置,用來標記要清空緩存的方法,當這個方法被調用並知足必定條件後,即會清空緩存。io
參數解析:class
allEntries:true表示清除value中的所有緩存,默認爲false。import
例子:配置
@CacheEvict(value="shops:detail",key="'id:'+#p0['id']",condition="#p0['id']>0") public Shop getById(Map<String, Object> param);
@Caching(evict={@CacheEvict(value="shops:brief",allEntries=true)}) public void delete(String id);
上面兩行代碼表示,只要執行了delete方法,就刷新緩存名爲」shops:brief」下面的全部緩存。
三、@CachePut:主要針對方法的配置,可以根據方法的請求參數對其結果進行緩存,和@Cacheable不一樣的是,它每次都會觸發真實方法的調用。
@CachePut(value="shops:detail",key="'id:'+#p0['id']") public Shop update(Map<String, Object> param);
上面兩行代碼表示,當調用update方法時,該方法體會被執行,而且執行的結果會返回寫入到緩存中。