Spring之Ehcache快取註解
阿新 • • 發佈:2019-01-03
一、@Cacheable(value,key,condition)
1.說明
主要針對方法配置,能夠根據方法的請求引數對其結果進行快取
引數 | 解釋 | example |
---|---|---|
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”) |
2.例項
當呼叫下面方法的時候,會從一個名叫 usersCache 的快取中查詢,如果沒有,則執行實際的方法(即查詢資料庫),並將執行的結果存入快取中,否則返回快取中的物件。這裡的快取中的 key 就是引數 name,value 就是 User物件。“usersCache”快取是在 spring*.xml 中定義的名稱。
@Cacheable(value="usersCache")
public User find(String name) {
return getFromDB(name);
}
二、@CachePut(value,key,condition)
1.說明
主要針對方法配置,能夠根據方法的請求引數對其結果進行快取,與@Cacheable不同的是使用@CachePut標註的方法在執行前,不會去檢查快取中是否存在之前執行過的結果,而是每次都會執行該方法,並將執行結果以鍵值對的形式存入指定的快取中。
引數 | 解釋 | example |
---|---|---|
value | 快取的名稱,在 spring 配置檔案中定義,必須指定至少一個 | @CachePut(value=”my cache”) |
key | 快取的 key,可以為空,如果指定要按照 SpEL 表示式編寫,如果不指定,則預設按照方法的所有引數進行組合 | @CachePut(value=”testcache”,key=”#userName”) |
condition | 快取的條件,可以為空,使用 SpEL 編寫,返回 true 或者 false,只有為 true 才進行快取 | @CachePut(value=”testcache”,condition=”#userName.length()>2”) |
2.例項
@CachePut 註釋,這個註釋可以確保方法被執行,同時方法的返回值也被記錄到快取中,實現快取與資料庫的同步更新
@CachePut(value="usersCache")//每次都會執行方法,並將結果存入指定的快取中
public User find(String name) {
return getFromDB(name);
}
三、@CacheEvict(value,key,condition,allEntries,beforeInvocation)
1.說明
主要針對方法配置,能夠根據一定的條件對快取進行清空
引數 | 解釋 | example |
---|---|---|
value | 快取的名稱,在 spring 配置檔案中定義,必須指定至少一個 | @CacheEvict(value=”my cache”) |
key | 快取的 key,可以為空,如果指定要按照 SpEL 表示式編寫,如果不指定,則預設按照方法的所有引數進行組合 | @CacheEvict(value=”testcache”,key=”#userName”) |
condition | 快取的條件,可以為空,使用 SpEL 編寫,返回 true 或者 false,只有為 true 才進行快取 | @CacheEvict(value=”testcache”,condition=”#userName.length()>2”) |
allEntries | 是否清空所有快取內容,預設為 false,如果指定為 true,則方法呼叫後將立即清空所有快取 | @CachEvict(value=”testcache”,allEntries=true) |
beforeInvocation | 是否在方法執行前就清空,預設為 false,如果指定為 true,則在方法還沒有執行的時候就清空快取,預設情況下,如果方法執行丟擲異常,則不會清空快取 | @CachEvict(value=”testcache”,beforeInvocation=true) |
2.例項
//清除快取中的所有元素
@CacheEvict(value="users", allEntries=true)
public void delete(Integer id) {
System.out.println("delete user by id: " + id);
}
//清除操作預設是在對應方法成功執行之後觸發的,即方法如果因為丟擲異常而未能成功返回時也不會觸發清除操作
@CacheEvict(value="users", beforeInvocation=true)
public void delete(Integer id) {
System.out.println("delete user by id: " + id);
}
四、@Caching(cacheable,put,evict)
主要可以讓我們在一個方法或者類上同時指定多個Spring Cache相關的註解
@Caching(cacheable = @Cacheable("users"), evict = { @CacheEvict("cache2"),
@CacheEvict(value = "cache3", allEntries = true) })
public User find(Integer id) {
return null;
}
SpEL上下文資料
名稱 | 位置 | 描述 | 示例 |
---|---|---|---|
methodName | root物件 | 當前被呼叫的方法名 | root.methodName |
method | root物件 | 當前被呼叫的方法 | root.method.name |
target | root物件 | 當前被呼叫的目標物件 | root.target |
targetClass | root物件 | 當前被呼叫的目標物件類 | root.targetClass |
args | root物件 | 當前被呼叫的方法的引數列表 | root.args[0] |
caches | root物件 | 當前方法呼叫使用的快取列表(如@Cacheable(value={“cache1”, “cache2”})),則有兩個cache | root.caches[0].name |
argument name | 執行上下文 | 當前被呼叫的方法的引數,如findById(Long id),我們可以通過#id拿到引數 | user.id |
result | 執行上下文 | 方法執行後的返回值(僅當方法執行之後的判斷有效,如‘unless','cache evict'的beforeInvocation=false) | result |