領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多這篇文章是我的先前 關於 JSR-107 的文章 的後續。新增 JSR-107 支援使我們有機會回顧我們自己的實現,並看看兩者如何和諧共存。Spring 4.1 還包含社群報告的一系列改進。
我也很高興地宣佈,一本專門針對快取抽象的新的入門指南已經發布,請檢視 使用 Spring 快取資料!
我們在 JSR-107 中發現的一個最好的特性是能夠在執行時解析要使用的快取,這是基於實際的方法執行的。到目前為止,我們自己的支援依賴於在註解(或切面定義)級別指定快取名稱。社群提出了幾個問題,報告當使用多個 CacheManager
時,需要能夠自定義那些名稱解析到的管理器。
我們最終所做的是建立了一個類似的 CacheResolver
抽象,以提供最靈活的選項。您可能已經猜到,預設實現接受一個 CacheManager
並根據提供的快取名稱解析要使用的快取。由於不再需要這些名稱,Spring 4.1 允許您編寫如下程式碼
@Cacheable
public Book findBook(ISBN isbn) {...}
當然,您必須指定自己的 CacheResolver
,它知道如何處理這個特定的呼叫,或者您需要以不同的方式提供要使用的快取(繼續閱讀)。
正如註解的 value
屬性不再是必需的一樣,只要設定了 CacheResolver
,就可以省略 CacheManager
。如果您以不同的方式管理 Cache
例項,您的 CacheResolver
實現可能根本不依賴於 CacheManager
。
社群還報告稱,他們希望能夠以更細粒度的方式控制快取行為。Spring 4.1 允許您為每個操作指定要使用的 CacheResolver
(或 CacheManager
)和 KeyGenerator
。
例如,以下程式碼將一個自定義的 KeyGenerator
應用於那個特定的操作
@Cacheable(value="book", keyGenerator="myKeyGenerator")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
這會查詢一個名稱為 myKeyGenerator
的 KeyGenerator
bean。CacheManager 和快取解析器例項也可以以類似的方式設定。
另一個社群反饋是能夠在方法級別共享這些自定義設定,而無需啟用任何預設快取行為。引入 @CacheConfig
,它在類級別提供相同的自定義設定,即快取名稱、CacheResolver
(或 CacheManager
)和 KeyGenerator
。
@CacheConfig(cacheNames="book", keyGenerator="myKeyGenerator")
public class BookRepository {
@Cacheable
public Book findBook(ISBN isbn) {...}
public Book thisIsNotCached(String someArg) {...}
}
我們實現 JSR-107 支援時的主要目標之一是利用我們自己抽象中已有的東西,以便現有應用程式可以非常順利地過渡。JCache 支援實際上在內部使用了 Spring 的快取抽象,這使您可以使用標準註解重用您現有的快取基礎設施。當您指定一個 JSR-107 自定義元件,例如 javax.cache.annotation.CacheResolver
或 javax.cache.annotation.CacheKeyGenerator
時,我們會使用介面卡將其透過我們的抽象進行路由。
具體來說,這意味著您可以保留您現有的基礎設施並選擇您想要的任何機制。例如,您可以有一個 ConcurrentMapCacheManager
,它在幕後使用 ConcurrentHashMap
並配合標準的 JSR-107 註解。
如果您想嘗試一下,請檢視這個 使用 JCache 而非 Spring 註解的指南分支(commit 32fea97 展示了具體改動)。
Spring 4.1 將於今年夏天釋出,它將對其快取抽象進行重大增強;新增對 JSR-107 的支援幫助我們進一步改進了這一點。本文未涵蓋其他一些小的增強功能,例如更好的異常處理以及 Cache
介面上方便的 putIfAbsent
方法。
和往常一樣,我們歡迎社群反饋,請嘗試這些功能,並告知我們您是否遇到任何問題。