在操作緩存中,一般會有以下幾種操作,在Spring的緩存中會對應有幾種注解:
* 獲取數據:從緩存獲得需要數據,如果緩存沒有則從數據庫查詢,再將其保存在緩存;
* 插入數據:先將數據插入數據庫中,再保存到緩存中;
* 更新數據:先將數據更新到數據庫中,再更新相應緩存數據;
* 刪除數據:先從數據庫中刪除數據,再刪除緩存中數據;
spring cache常用注解為:@Cacheable、@CachePut、@CacheEvit
@Cacheable 的作用:適用于獲取數據,如果緩存中有數據,不在調用注解方法;
@CachePut 的作用:適合于插入數據和更新數據。一定會調用真實方法,再將方法返回值保存到緩存;
@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”) |
一、xml配置文件
//cacheManager為具體的緩存管理器例如RedisCacheManager
<cache:annotation-driven cache-mamage="cacheManager" />
二、項目中操作
@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;
}
}
三、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 調用注解類:
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。