Spring- Cache緩存


在操做緩存中,通常會有如下幾種操做,在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 調用註解類:

相關文章
相關標籤/搜索