Spring緩存註解@Cacheable、@CachePut和@CacheEvict

Spring 聲名式註解緩存

1、@Cacheable:主要用來配置方法,能夠根據方法的請求參數對其結果進行緩存。即當重複使用相同參數調用方法的時候,方法本身不會被調用執行,即方法本身被略過了,取而代之的是方法的結果直接從緩存中找到並返回了。

參數介紹

  • value:緩存的名字,必須指定至少一個。

  • key:緩存的key,可以爲空,如果指定要按照SpEL表達式編寫;如果不指定,則缺省按照方法的所有參數進行組合。

  • condition:緩存的條件,可以爲空,使用SpEL編寫,返回true或者false,只有爲true才能緩存。

    例子:

    @Cacheable(value="shops:detail",key="'id:'+#p0")
    public Shop getById(String id);
  • 1
  • 2
  • 1
  • 2

這兩行代碼的意思是指,緩存的名字爲:shops:detail,其中緩存的key值爲id:id的值。其中#p0的意思是指加有@Cacheable註解的方法中的第一個參數

2、@CacheEvict:主要對方法配置,用來標記要清空緩存的方法,當這個方法被調用並滿足一定條件後,即會清空緩存。

參數解析

  • value:緩存的位置,不能爲空。
  • key:緩存的key,默認爲空。
  • condition:觸發的條件,只有滿足條件的情況纔會清楚緩存,默認爲空,支持SpEL。
  • allEntries:true表示清除value中的全部緩存,默認爲false。
  • beforeInvocation:是否在方法執行前就清空,缺省爲 false,如果指定爲 true,則在方法還沒有執行的時候就清空緩存,缺省情況下,如果方法執行拋出異常,則不會清空緩存

    例子:

    @CacheEvict(value="shops:detail",key="'id:'+#p0['id']",condition="#p0['id']>0")
    public Shop getById(Map<String, Object> param);
  • 1
  • 2
  • 1
  • 2

上面兩行代碼表示,只要param中key爲id的值大於0,將進行緩存操作,否則直接調用調用getById方法返回結果。

    @Caching(evict={@CacheEvict(value="shops:brief",allEntries=true)})
    public void delete(String id);
  • 1
  • 2
  • 1
  • 2

上面兩行代碼表示,只要執行了delete方法,就刷新緩存名爲”shops:brief”下面的所有緩存。

3、@CachePut:主要針對方法的配置,能夠根據方法的請求參數對其結果進行緩存,和@Cacheable不同的是,它每次都會觸發真實方法的調用。

  • value:緩存的位置,不能爲空。
  • key:緩存的key,默認爲空。
  • condition:觸發的條件,只有滿足條件的情況纔會清楚緩存,默認爲空,支持SpEL。

    @CachePut(value="shops:detail",key="'id:'+#p0['id']")
    public Shop update(Map<String, Object> param);
  • 1
  • 2
  • 1
  • 2

上面兩行代碼表示,當調用update方法時,該方法體會被執行,並且執行的結果會返回寫入到緩存中。


key屬性是用來指定Spring緩存方法的返回結果時對應的key的。該屬性支持SpringEL表達式。當我們沒有指定該屬性時,Spring將使用默認策略生成key。我們這裏先來看看自定義策略,至於默認策略會在後文單獨介紹。

       自定義策略是指我們可以通過Spring的EL表達式來指定我們的key。這裏的EL表達式可以使用方法參數及它們對應的屬性。使用方法參數時我們可以直接使用“#參數名”或者“#p參數index”。下面是幾個使用參數作爲key的示例。

   @Cacheable(value="users", key="#id")

   public User find(Integer id) {

      returnnull;

   }

   @Cacheable(value="users", key="#p0")

   public User find(Integer id) {

      returnnull;

   }

   @Cacheable(value="users", key="#user.id")

   public User find(User user) {

      returnnull;

   }

   @Cacheable(value="users", key="#p0.id")

   public User find(User user) {

      returnnull;

   } 


Spring還爲我們提供了一個root對象可以用來生成key。通過該root對象我們可以獲取到以下信息。

屬性名稱

描述

示例

methodName

當前方法名

#root.methodName

method

當前方法

#root.method.name

target

當前被調用的對象

#root.target

targetClass

當前被調用的對象的class

#root.targetClass

args

當前方法參數組成的數組

#root.args[0]

caches

當前被調用的方法使用的Cache

#root.caches[0].name


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章