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 |