欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring 緩存抽象示例詳解

 更新時(shí)間:2018年09月05日 14:25:27   作者:仍是少年  
Spring框架自身并沒有實(shí)現(xiàn)緩存解決方案,但是從3.1開始定義了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口,提供對(duì)緩存功能的聲明,能夠與多種流行的緩存實(shí)現(xiàn)集成。這篇文章主要介紹了Spring 緩存抽象 ,需要的朋友可以參考下

Spring緩存抽象概述

Spring框架自身并沒有實(shí)現(xiàn)緩存解決方案,但是從3.1開始定義了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口,提供對(duì)緩存功能的聲明,能夠與多種流行的緩存實(shí)現(xiàn)集成。

Cache接口為緩存的組件規(guī)范定義,包含緩存的各種操作集合;

Cache接口下Spring提供了各種xxxCache的實(shí)現(xiàn):如RedisCache,EhCacheCache , ConcurrentMapCache等;

CacheManager接口為緩存管理器規(guī)范,簡單來說就是用于存放cache,Spring默認(rèn)也提供了一些列管理器的實(shí)現(xiàn)。

Spring緩存抽象提供了5個(gè)注解用來聲明緩存規(guī)則:

@Cacheable:能夠根據(jù)方法的請(qǐng)求參數(shù)對(duì)其結(jié)果進(jìn)行緩存,多用于查詢

@CachePut: 執(zhí)行方法,并緩存結(jié)果

@CacheEvict:清空緩存

@Caching:能夠同時(shí)應(yīng)用多個(gè)緩存注解功能

@CacheConfig: 用于抽取緩存的公共配置(類級(jí)別)

以上5個(gè)注解除了@CacheConfig注解是類級(jí)別的注解,其余4個(gè)注解在類和方法上均可以使用,作用在類上表示對(duì)該類下所有方法生效,作用的方法上只對(duì)該方法生效,且只能用于public修飾的符方法,protected或者private修飾的方法不適用。

@Cacheable注解

@Cacheable注解的作用是Spring在調(diào)用該方法之前,首先在緩存中查找方法的返回值,默認(rèn)的key是根據(jù)參數(shù)值生成,如果存在,直接返回緩存中的值,否則執(zhí)行該方法,并將返回值保存到緩存中

@Cacheable運(yùn)行流程:

  1.方法運(yùn)行之前,先去查詢Cache(緩存組件),按照cacheNames指定的名字獲取;

           (CacheManager先獲取相應(yīng)的緩存),第一次獲取緩存如果沒有Cache組件會(huì)自動(dòng)創(chuàng)建。

  2.去Cache中查找緩存的內(nèi)容,使用一個(gè)key,默認(rèn)就是方法的參數(shù)值;

           key是按照某種策略生成的;默認(rèn)是使用keyGenerator生成的,              

     Spring默認(rèn)加載的是SimpleCacheManage,SimpleKeyGenerator生成key的默認(rèn)策略是:

                       如果沒有參數(shù);key=new SimpleKey()

                       如果有一個(gè)參數(shù):key=參數(shù)的值

                       如果有多個(gè)參數(shù):key=new SimpleKey(params)

  3.沒有查到緩存就調(diào)用目標(biāo)方法;

  4.將目標(biāo)方法返回的結(jié)果,放進(jìn)緩存中

@Cacheable屬性說明:

  1.acheNames/value:該屬性值必須提供,指定緩存組件的名字,將方法的返回結(jié)果放在哪個(gè)緩存中,是數(shù)組的方式,可以指定多個(gè)緩存;

      如:cacheNames = "product"或者cacheNames = {"product1","product2"}

  2.key:緩存數(shù)據(jù)使用的key,不指定key則默認(rèn)是使用方法參數(shù)的值該屬性值支持SpEL表達(dá)式

       3.cacheManager:指定緩存管理器;或者cacheResolver指定獲取解析器

       4.condition:指定符合條件的情況下才緩存

  5.unless:否定緩存;當(dāng)unless指定的條件為true,方法的返回值就不會(huì)被緩存;可以獲取到結(jié)果進(jìn)行判斷

                  unless = "#result == null"

                   unless = "#a0==2":如果第一個(gè)參數(shù)的值是2,結(jié)果不緩存;

  6.sync:是否使用異步模式

使用示例:

@Cacheable(cacheNames = "product")// 默認(rèn)key為參數(shù),多個(gè)參數(shù)SimpleKey [arg1,arg2]
//@Cacheable(cacheNames = "product",key = "#root.methodName+'['+#id+']'")
//@Cacheable(cacheNames = "product",keyGenerator = "myKeyGenerator")
//@Cacheable(cacheNames = "product",key = "#root.methodName+'['+#id+']'",condition="#a0>10",unless = "#a0==11") //帶條件的緩存滿足condition=true緩存,滿足unless=true則不緩存 
public Product getProductById(Long id){
  Product product =productMapper.getProductById(id);
  System.out.println(product);
  return product;
}
//指定key屬性值
@Cacheable(cacheNames ="product", key="#id")  //”#+參數(shù)名”的形式,直接使用參數(shù)名
//或者
//@Cacheable(cacheNames ="product", key="#a0")  //”#a+參數(shù)位置”的形式
  public Product getProductById(long id) {
   xxxx
  }
@Cacheable(cacheNames ="product", key="# productcondition.productId")  
//或者
//@Cacheable(cacheNames ="product", key="#a0.productId")  
  public Product getProduct (Product productcondition) {
   xxxx
  }

自定義Key生成器

除了通過SPEL表達(dá)式之外,還可以通過自定義key生成器的方式,Spring緩存模塊提供了org.springframework.cache.interceptor.KeyGenerator接口用于緩存key的生成聲明,因此我們可以自定義一個(gè)MyKeyGenerator類并實(shí)現(xiàn)了KeyGenerator接口 ,使用如下:

@Configuration
public class MyCacheConfig {
  @Bean("myKeyGenerator")
  public KeyGenerator keyGenerator(){
    return new KeyGenerator(){
      @Override
      public Object generate(Object target, Method method, Object... params) {
        return method.getName()+"["+ Arrays.asList(params).toString()+"]";
      }
    };
  }
}

該方法測試用,關(guān)于緩存key的生成方式,網(wǎng)上有很多種策略。

使用時(shí)只需要修改注解的key屬性即可:

 @Cacheable(cacheNames = "product",keyGenerator = "myKeyGenerator")

 @CachePut

@CachePut注解的作用簡單的說一句話:既調(diào)用方法,又緩存數(shù)據(jù)。@cachePut和@Cacheable兩個(gè)注解都可以用于填充緩存,但使用上略有點(diǎn)差異,@Cacheable注解的執(zhí)行流程是先在按key在緩存中查找,存在則返回,不存在則執(zhí)行目標(biāo)方法,并緩存目標(biāo)方法的結(jié)果。而@CachePut并不會(huì)檢查緩存,總是先執(zhí)行目標(biāo)方法,并將目標(biāo)方法的結(jié)果保存到緩存中。實(shí)際中比如執(zhí)行到更新操作時(shí),則希望將最新的數(shù)據(jù)更新到緩存,如果該方法返回異常,將不再執(zhí)行保存緩存的邏輯。

@CachePut屬性說明

@CachePut注解屬性與@CachePut類似,并沒有增加其他屬性

使用示例:

@CachePut(value="product",key = "#result.productId",condition = "#result!=null")
public Product updateProduct(Product product){
  int count = productMapper.updateProduct(product);
  System.out.println("影響行數(shù):"+count);
  if(count>0){
    return product;
  }else{
    return null;
  }
}

@CacheEvict注解

該注解的作用根據(jù)指定的key或者是allEntries屬性值移除緩存中特性的鍵值對(duì)。

@CacheEvict屬性說明

與@Cacheable相比@CacheEvict注解提供了另外兩個(gè)屬性:

1.allEntries:表示是否清空所有緩存內(nèi)容,默認(rèn)false,如果該值為true則清空指定cacheNames緩存塊下所有內(nèi)容,如果指定了allEntries為true,那么再zhidingkey值將沒有意義

2.beforeInvocation:是否在執(zhí)行方法前請(qǐng)空緩存,默認(rèn)值為false,如果該值為true則在調(diào)用目標(biāo)方法前執(zhí)行清空緩存,為false的情況下,如果目標(biāo)方法拋出異常,則不再執(zhí)行清空緩存邏輯

示例:

 //@CacheEvict(value="product",key="#id")
 //@CacheEvict(value="product",allEntries = true) //清楚所有緩存
 @CacheEvict(value="product",allEntries = true,beforeInvocation = true) //清楚所有緩存
 public boolean deleteProductById(Long id) {
   productMapper.deleteProductById(id);
   return true;
 }

@Caching注解

該注解是一個(gè)分組注解,作用是可以同時(shí)應(yīng)用多個(gè)其他注解,該注解提供了3個(gè)屬性cacheable,put,evict分別用于組合@Cacheable、@CachePut、@CacheEvict三個(gè)注解

使用示例:

@Caching(
     cacheable = {@Cacheable(value="product",key="#productName")},
     put = {
         @CachePut(value="product",key="#result.productId"),
         @CachePut(value="product",key="#result.productName")
     }
 )
 public Product getProductByName(String productName){
   Product product =productMapper.getProductByName(productName);
   return product;
 }

當(dāng)@Cacheing同時(shí)含有CachePut注解和Cacheable注解時(shí),仍然會(huì)先執(zhí)行目標(biāo)方法。(并不是按@Cacheable的執(zhí)行過程,先檢查緩存,存在則返回)

@CacheConfig

是一個(gè)類級(jí)別的注解,允許共享緩存的名稱、KeyGenerator、CacheManager 和CacheResolver

示例:

@Service
 @CacheConfig(cacheNames = "product")
 public class ProductService {
 }

在類上使用該注解,指定cacheNames屬性值,則類中方法上的注解將默認(rèn)繼承了該屬性值,如果方法上注解使用和了@CacheConfig向同的屬性,則以方法上的為準(zhǔn)。

 @Service
 @CacheConfig(cacheNames = "product")
 public class ProductService {
   @Autowired
   private ProductMapper productMapper; 
   @Cacheable(cacheNames = "product1",key = "#root.methodName+'['+#id+']'")
   public Product getProductById(Long id){
     Product product =productMapper.getProductById(id);
    System.out.println(product);
    return product;
   }
 }

上面@Cacheable和@CacheConfig都指定了屬性值cacaeNames,實(shí)際以方法上注解指定的為準(zhǔn)。

Spring緩存抽象的關(guān)鍵原理就是使用spring AOP,通過切面實(shí)現(xiàn)了在方法調(diào)用前、調(diào)用后獲取方法的入?yún)⒑头祷刂?,進(jìn)而實(shí)現(xiàn)了緩存的邏輯。

總結(jié)

以上所述是小編給大家介紹的Spring 緩存抽象示例詳解,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Java字節(jié)碼ByteBuddy使用及原理解析上

    Java字節(jié)碼ByteBuddy使用及原理解析上

    這篇文章主要為大家介紹了Java字節(jié)碼ByteBuddy使用及原理解析上篇,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • SpringMVC圖片文件跨服務(wù)器上傳

    SpringMVC圖片文件跨服務(wù)器上傳

    這篇文章主要為大家詳細(xì)介紹了SpringMVC圖片文件跨服務(wù)器上傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 從字節(jié)碼角度解析synchronized和反射實(shí)現(xiàn)原理

    從字節(jié)碼角度解析synchronized和反射實(shí)現(xiàn)原理

    這篇文章主要介紹了從字節(jié)碼角度解析synchronized和反射的實(shí)現(xiàn)原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • springBoot 與neo4j的簡單整合示例

    springBoot 與neo4j的簡單整合示例

    這篇文章主要介紹了springBoot 與neo4j的簡單整合示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • idea中如何使用git進(jìn)行版本回退詳解

    idea中如何使用git進(jìn)行版本回退詳解

    工作中遇到git遠(yuǎn)程倉庫需要回退到歷史版本的問題,根據(jù)網(wǎng)上的搜索結(jié)果結(jié)合自己的實(shí)踐,下面這篇文章主要給大家介紹了關(guān)于idea中如何使用git進(jìn)行版本回退的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • Java/Spring項(xiàng)目的包開頭為什么是com詳解

    Java/Spring項(xiàng)目的包開頭為什么是com詳解

    這篇文章主要介紹了Java/Spring項(xiàng)目的包開頭為什么是com的相關(guān)資料,在Java中包命名遵循域名反轉(zhuǎn)規(guī)則,即使用公司的域名反轉(zhuǎn)作為包的前綴,以確保其全球唯一性和避免命名沖突,這種規(guī)則有助于邏輯分層、代碼可讀性提升和標(biāo)識(shí)代碼來源,需要的朋友可以參考下
    2024-10-10
  • springboot自動(dòng)配置原理解析

    springboot自動(dòng)配置原理解析

    這篇文章主要介紹了springboot自動(dòng)配置原理解析,幫助大家更好的理解和學(xué)習(xí)使用springboot,感興趣的朋友可以了解下
    2021-04-04
  • 解決swagger2中@ApiResponse的response不起作用

    解決swagger2中@ApiResponse的response不起作用

    這篇文章主要介紹了解決swagger2中@ApiResponse的response不起作用問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java線程中的常見方法(start方法和run方法)

    Java線程中的常見方法(start方法和run方法)

    這篇文章主要介紹了Java線程中的常見方法(start方法和run方法),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • 關(guān)于在Java中如何使用yaml的實(shí)例

    關(guān)于在Java中如何使用yaml的實(shí)例

    這篇文章主要介紹了關(guān)于在Java中如何使用yaml的實(shí)例,YAML是一種輕量級(jí)的數(shù)據(jù)序列化格式。它以易讀、易寫的文本格式表示數(shù)據(jù),支持列表、字典等各種數(shù)據(jù)結(jié)構(gòu),被廣泛應(yīng)用于配置文件、數(shù)據(jù)傳輸協(xié)議等領(lǐng)域,需要的朋友可以參考下
    2023-08-08

最新評(píng)論