在操做緩存中,通常會有如下幾種操做,在Spring的緩存中會對應有幾種註解:spring
* 獲取數據:從緩存得到須要數據,若是緩存沒有則從數據庫查詢,再將其保存在緩存;數據庫
* 插入數據:先將數據插入數據庫中,再保存到緩存中;緩存
* 更新數據:先將數據更新到數據庫中,再更新相應緩存數據;ide
* 刪除數據:先從數據庫中刪除數據,再刪除緩存中數據;spa
spring cache經常使用註解爲:@Cacheable、@CachePut、@CacheEvit代理
@Cacheable 的做用:適用於獲取數據,若是緩存中有數據,不在調用註解方法;orm
@CachePut 的做用:適合於插入數據和更新數據。必定會調用真實方法,再將方法返回值保存到緩存;xml
@CachEvict 的做用:適合於刪除數據。對象
主要的參數 | ||
value | 緩存的名稱,能夠在 spring 配置文件中定義,必須指定至少一個 | 例如: @Cacheable(value=」mycache」) 或者 @Cacheable(value={」cache1」,」cache2」} |
key | 緩存的 key,能夠爲空,若是指定要按照 SpEL 表達式編寫,若是不指定,則缺省按照方法的全部參數進行組合 | 例如: @Cacheable(value=」testcache」,key=」#userName」) |
condition | 緩存的條件,能夠爲空,使用 SpEL 編寫,返回 true 或者 false,只有爲 true 才進行緩存 | 例如: @Cacheable(value=」testcache」,condition=」#userName.length()>2」) |
1、xml配置文件ci
//cacheManager爲具體的緩存管理器例如RedisCacheManager
<cache:annotation-driven cache-mamage="cacheManager" />
2、項目中操做
@CacheConfig(cacheNames="prizeinfo")
@Service(value="springRedisService")
public class SpringRedisServiceImpl implements SpringRedisService{
@Autowired
private PrizeinfoService prizeinfoService;
@Cacheable(key="'id:'+#id")
public Prizeinfo getObject(int id) {
return prizeinfoService.getPrizeinfoById(id);
}
@CachePut(key="'id:'+#o.id")
public Prizeinfo insertObject(Prizeinfo o) {
prizeinfoService.insertPrizeinfo(o);
System.out.println("insertObject"+o.getId());
return o;
}
@CacheEvict(key="'id:'+#id")
public int deleteObjectById(int id) {
prizeinfoService.deletePrizeinfoById(id);
return id;
}
}
3、Spring Cache原理:
Spring Cache實際是利用Spring Aop原理來實現的。具體的執行流程和源碼,下面將講解
#標籤會默認的建立什麼對象??
1. 解析自定義緩存標籤<cache:annotation-driven />
1.1 利用springIoc先解析標籤器類AnnotationDrivenCacheBeanDefinitionParser 。
//存儲自定義標籤和解析標籤類的關係
CacheNamespaceHandler
//解析自定義的標籤的解析器,將xml其生成beandefinition
BeanDefinitionParser
AnnotationDrivenCacheBeanDefinitionParser
1.2 AnnotationDrivenCacheBeanDefinitionParser解析方法parser,解析標籤屬性,建立對應BeanDefinition。(圖解在https://www.processon.com/embed/58afa70be4b0793432a703c9)
//通知器自動代理生成器 名稱:org.springframework.cache.config.internalCacheAdvisor
·InfrastructureAdvisorAutoProxyCreator
//緩存的基本操做
·AnnotationCacheOperationSource
//攔截器類 設置屬性:cacheOperationSources
·CacheInterceptor
//通知器
//設置通知屬性:adviceBeanName:CacheInterceptor
//設置cacheOperationSource屬性:AnnotationCacheOperationSource
·BeanFactoryCacheOperationSourceAdvisor
#註解的類是什麼時候,經過什麼方式和緩存關聯的??
2. 註解緩存類SpringRedisServiceImpl 實例化對象
2.1 使用自動代理建立器的時機:
2.2 自動代理建立器的建立過程:
2.3 調用註解類: