1. 程式人生 > >Spring之Ehcache快取註解

Spring之Ehcache快取註解

一、@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