亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Spring 緩存抽象示例詳解

2024-07-14 08:42:15
字體:
來源:轉載
供稿:網友

Spring緩存抽象概述

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

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

Cache接口下Spring提供了各種xxxCache的實現:如RedisCache,EhCacheCache , ConcurrentMapCache等;

CacheManager接口為緩存管理器規范,簡單來說就是用于存放cache,Spring默認也提供了一些列管理器的實現。

Spring緩存抽象提供了5個注解用來聲明緩存規則:

@Cacheable:能夠根據方法的請求參數對其結果進行緩存,多用于查詢

@CachePut: 執行方法,并緩存結果

@CacheEvict:清空緩存

@Caching:能夠同時應用多個緩存注解功能

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

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

@Cacheable注解

@Cacheable注解的作用是Spring在調用該方法之前,首先在緩存中查找方法的返回值,默認的key是根據參數值生成,如果存在,直接返回緩存中的值,否則執行該方法,并將返回值保存到緩存中

@Cacheable運行流程:

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

           (CacheManager先獲取相應的緩存),第一次獲取緩存如果沒有Cache組件會自動創建。

  2.去Cache中查找緩存的內容,使用一個key,默認就是方法的參數值;

           key是按照某種策略生成的;默認是使用keyGenerator生成的,              

     Spring默認加載的是SimpleCacheManage,SimpleKeyGenerator生成key的默認策略是:

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

                       如果有一個參數:key=參數的值

                       如果有多個參數:key=new SimpleKey(params)

  3.沒有查到緩存就調用目標方法;

  4.將目標方法返回的結果,放進緩存中

@Cacheable屬性說明:

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

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

  2.key:緩存數據使用的key,不指定key則默認是使用方法參數的值該屬性值支持SpEL表達式

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

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

  5.unless:否定緩存;當unless指定的條件為true,方法的返回值就不會被緩存;可以獲取到結果進行判斷

                  unless = "#result == null"

                   unless = "#a0==2":如果第一個參數的值是2,結果不緩存;

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

使用示例:

@Cacheable(cacheNames = "product")// 默認key為參數,多個參數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")  //”#+參數名”的形式,直接使用參數名//或者//@Cacheable(cacheNames ="product", key="#a0")  //”#a+參數位置”的形式  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表達式之外,還可以通過自定義key生成器的方式,Spring緩存模塊提供了org.springframework.cache.interceptor.KeyGenerator接口用于緩存key的生成聲明,因此我們可以自定義一個MyKeyGenerator類并實現了KeyGenerator接口 ,使用如下:

@Configurationpublic 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()+"]";      }    };  }}

該方法測試用,關于緩存key的生成方式,網上有很多種策略。

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

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

 @CachePut

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

@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("影響行數:"+count);  if(count>0){    return product;  }else{    return null;  }}

@CacheEvict注解

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

@CacheEvict屬性說明

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

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

2.beforeInvocation:是否在執行方法前請空緩存,默認值為false,如果該值為true則在調用目標方法前執行清空緩存,為false的情況下,如果目標方法拋出異常,則不再執行清空緩存邏輯

示例:

 //@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注解

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

使用示例:

@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; }

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

@CacheConfig

是一個類級別的注解,允許共享緩存的名稱、KeyGenerator、CacheManager 和CacheResolver

示例:

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

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

 @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,實際以方法上注解指定的為準。

Spring緩存抽象的關鍵原理就是使用spring AOP,通過切面實現了在方法調用前、調用后獲取方法的入參和返回值,進而實現了緩存的邏輯。

總結

以上所述是小編給大家介紹的Spring 緩存抽象示例詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
最近更新的2019中文字幕| 国自产精品手机在线观看视频| 国产免费一区视频观看免费| 亚洲成人激情视频| 91美女福利视频高清| 久久久久久久久久久网站| 久久精品久久久久久| 国产成人综合亚洲| 久久国产精品99国产精| 中国china体内裑精亚洲片| 欧美最猛性xxxxx亚洲精品| 欧美日韩在线影院| 色琪琪综合男人的天堂aⅴ视频| 欧美在线视频一区二区| 欧美与黑人午夜性猛交久久久| 国产亚洲欧美另类中文| 久久69精品久久久久久久电影好| 欧美激情在线观看视频| 国产噜噜噜噜噜久久久久久久久| 国产精品主播视频| 欧洲成人在线观看| 亚洲国产精彩中文乱码av在线播放| 中文字幕一区二区精品| 亚洲性av网站| 国产精品久久婷婷六月丁香| 日韩成人av网| 久久久噜噜噜久久中文字免| 亚洲最大福利视频| 国产精品99久久久久久人| 国产亚洲视频中文字幕视频| 69视频在线免费观看| 日韩中文字幕精品| 国产+成+人+亚洲欧洲| 欧美电影电视剧在线观看| 亚洲第一中文字幕在线观看| 国产精品欧美久久久| 欧美日韩在线影院| 亚洲欧美中文另类| 国产成人福利夜色影视| 久久视频在线免费观看| 亚洲欧美在线一区| 国产精品国模在线| 正在播放欧美一区| 亚洲成人精品久久久| 91久久中文字幕| 久久九九精品99国产精品| 九九九久久久久久| 在线日韩欧美视频| 深夜成人在线观看| 91爱爱小视频k| 国产精品91免费在线| 日本欧美国产在线| 久久精品视频va| 国产亚洲成精品久久| 精品中文字幕久久久久久| 91啪国产在线| 亚洲电影成人av99爱色| 伦理中文字幕亚洲| 亚洲欧美制服第一页| 国产精品海角社区在线观看| 91精品视频在线看| 国产精品扒开腿做爽爽爽的视频| 欧美日韩一区二区免费在线观看| 一区二区中文字幕| 欧美性猛交xxxx富婆弯腰| 久久久国产在线视频| 91视频88av| 亚洲免费高清视频| 国产精品一区久久久| 一本一本久久a久久精品牛牛影视| 亚洲xxx大片| 亚洲老头同性xxxxx| 久久国产精品亚洲| 久久精品电影网| 欧美性猛交xxxx乱大交蜜桃| 国产91精品在线播放| 亚洲黄页网在线观看| 欧美激情aaaa| 成人字幕网zmw| 日韩欧美中文第一页| 色999日韩欧美国产| 久久精品99久久香蕉国产色戒| 国产精品电影观看| 亚洲黄色有码视频| 欧美日韩另类字幕中文| 1769国产精品| 国产成人91久久精品| 91在线视频九色| 韩国美女主播一区| 国产精品久久久久aaaa九色| 国产精品人人做人人爽| 久久久久久网站| 欧美成人三级视频网站| 精品久久久久久久久国产字幕| 97精品国产91久久久久久| 日韩av网站在线| 日韩中文字幕视频在线| 国产精品极品在线| 欧美激情啊啊啊| 日韩欧美高清视频| 国产z一区二区三区| 久热爱精品视频线路一| 亚洲精品视频网上网址在线观看| 欧美精品免费在线| 亚洲色图偷窥自拍| 国产啪精品视频| 丁香五六月婷婷久久激情| 国产精品永久免费在线| 欧美xxxx做受欧美.88| 91经典在线视频| 欧美性xxxx18| 日本精品一区二区三区在线| 欧美精品videossex88| 欧美成人激情视频免费观看| 国产精品久久久久久久app| 最近的2019中文字幕免费一页| 亚洲精品综合精品自拍| 成人h片在线播放免费网站| 欧美日韩福利视频| 7777精品视频| 亚洲第一网站免费视频| 国自产精品手机在线观看视频| 国产精自产拍久久久久久蜜| 91av在线看| 亚洲国产精品va| 亚洲毛片在线观看| 久久久久久久色| 久久免费视频这里只有精品| 亚洲aⅴ男人的天堂在线观看| 久久国产加勒比精品无码| 狠狠综合久久av一区二区小说| 这里只有视频精品| 伊人久久男人天堂| 欧美精品成人在线| 日本不卡免费高清视频| 欧美国产精品va在线观看| 51色欧美片视频在线观看| 欧美精品日韩www.p站| 欧美中文在线观看| 久久夜色撩人精品| 欧美性理论片在线观看片免费| 亚洲免费视频观看| 欧美成人在线影院| 日韩av有码在线| 中文字幕视频在线免费欧美日韩综合在线看| 97av在线视频| 欧美性生活大片免费观看网址| 国产精品专区一| 在线观看久久av| 久久国产精品网站| 美日韩精品免费视频| 色偷偷av一区二区三区| 曰本色欧美视频在线| 美女扒开尿口让男人操亚洲视频网站| 国产精品偷伦一区二区| 成人精品视频久久久久| 激情成人中文字幕| 97视频网站入口| 亚洲美女性生活视频| 日韩av网站在线| xxav国产精品美女主播| 欧美性猛交xxxx免费看久久久| 欧美激情精品久久久久久久变态| 91精品久久久久久久|