標籤:book ace 多個 load ash apple 運算式 資料庫 tostring
@CacheConfig:主要用於配置該類中會用到的一些共用的緩衝配置。在這裡@CacheConfig(cacheNames = "users"):配置了該Data Access Objects中返回的內容將儲存於名為users的緩衝對象中,我們也可以不使用該註解,直接通過@Cacheable自己配置緩衝集的名字來定義。
@Cacheable:配置了findByName函數的傳回值將被加入緩衝。同時在查詢時,會先從緩衝中擷取,若不存在才再發起對資料庫的訪問。該註解主要有下面幾個參數:
@Cacheable(cacheNames="books", key="#isbn")public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)@Cacheable(cacheNames="books", key="#isbn.rawNumber")public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)@Cacheable(cacheNames="books", key="T(someType).hash(#isbn)")public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)@Cacheable(cacheNames="books", key="#map[‘bookid‘].toString()")public Book findBook(Map<String, Object> map)
緩衝的同步 sync:
在多線程環境下,某些操作可能使用相同參數同步調用。預設情況下,緩衝不鎖定任何資源,可能導致多次計算,而違反了緩衝的目的。對於這些特定的情況,屬性 sync 可以指示底層將緩衝鎖住,使只有一個線程可以進入計算,而其他線程堵塞,直到返回結果更新到緩衝中。
例:
@Cacheable(cacheNames="foos", sync="true")public Foo executeExpensiveOperation(String id) {...}
value、cacheNames:兩個等同的參數(cacheNames為Spring 4新增,作為value的別名),用於指定緩衝儲存的集合名。由於Spring 4中新增了@CacheConfig,因此在Spring 3中原本必須有的value屬性,也成為非必需項了
key:緩衝Object Storage Service在Map集合中的key值,非必需,預設按照函數的所有參數組合作為key值,若自己配置需使用SpEL運算式,比如:@Cacheable(key = "#p0"):使用函數第一個參數作為緩衝的key值,更多關於SpEL運算式的詳細內容可參考官方文檔
condition:緩衝對象的條件,非必需,也需使用SpEL運算式,只有滿足運算式條件的內容才會被緩衝,比如:@Cacheable(key = "#p0", condition = "#p0.length() < 3"),表示只有當第一個參數的長度小於3的時候才會被緩衝,若做此配置上面的AAA使用者就不會被緩衝,讀者可自行實驗嘗試。
@Cacheable(cacheNames="book", condition="#name.length < 32")public Book findBook(String name)
unless:另外一個緩衝條件參數,非必需,需使用SpEL運算式。它不同於condition參數的地方在於它的判斷時機,該條件是在函數被調用之後才做判斷的,所以它可以通過對result進行判斷。
@Cacheable(cacheNames="book", condition="#name.length < 32", unless="#result.name.length > 5"")public Book findBook(String name)
keyGenerator:用於指定key產生器,非必需。若需要指定一個自訂的key產生器,我們需要去實現org.springframework.cache.interceptor.KeyGenerator介面,並使用該參數來指定。需要注意的是:該參數與key是互斥的
cacheManager:用於指定使用哪個緩衝管理器,非必需。只有當有多個時才需要使用
cacheResolver:用於指定使用那個緩衝解析器,非必需。需通過org.springframework.cache.interceptor.CacheResolver介面來實現自己的緩衝解析器,並用該參數指定。
除了這裡用到的兩個註解之外,還有下面幾個核心註解:
@CachePut:配置於函數上,能夠根據參數定義條件來進行緩衝,它與@Cacheable不同的是,它每次都會真是調用函數,所以主要用於資料新增和修改操作上。它的參數與@Cacheable類似,具體功能可參考上面對@Cacheable參數的解析
@CachePut(cacheNames="book", key="#isbn")public Book updateBook(ISBN isbn, BookDescriptor descriptor)
@CacheEvict:配置於函數上,通常用在刪除方法上,用來從緩衝中移除相應資料。除了同@Cacheable一樣的參數之外,它還有下面兩個參數:
allEntries:非必需,預設為false。當為true時,會移除所有資料
@CacheEvict(cacheNames="books", allEntries=true)public void loadBooks(InputStream batch)
beforeInvocation:非必需,預設為false,會在調用方法之後移除資料。當為true時,會在調用方法之前移除資料。
@CacheEvict(cacheNames="books", beforeInvocation=true)public void loadBooks(InputStream batch)
spring Cache註解詳解