領先一步
VMware 提供培訓和認證,以加速您的進展。
了解更多這篇文章是我之前關於 JSR-107 的文章的後續。新增 JSR-107 支援讓我們有機會回顧我們自己的實作,並了解這兩者如何和諧共存。Spring 4.1 還包含社群回報的一系列改進。
我也很高興地宣布,一個專門介紹快取抽象的新入門指南已經發布,請查看 使用 Spring 快取資料!
我們在 JSR-107 中發現最棒的功能之一是能夠在執行階段解析要使用的快取,也就是基於實際的方法執行。到目前為止,我們自己的支援依賴於在註解(或 aspect 定義)層級指定的快取名稱。有人提出幾個問題,指出當使用多個 CacheManager
時,需要能夠自訂這些名稱解析到的管理器。
我們最終做的是建立一個類似的 CacheResolver
抽象,以提供最彈性的選項。您可能猜到,預設的實作採用 CacheManager
並根據提供的快取名稱解析要使用的快取。由於不再需要此類名稱,Spring 4.1 允許您編寫以下程式碼
@Cacheable
public Book findBook(ISBN isbn) {...}
當然,您必須指定自己的 CacheResolver
,它知道如何處理這個特定的調用,或者您需要以不同的方式提供要使用的快取(請繼續閱讀)。
正如不再需要註解的 value
屬性一樣,只要設定了 CacheResolver
,就可以省略 CacheManager
。如果您以不同的方式管理 Cache
實例,您實際上可以擁有一個完全不依賴 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
,它在後端使用具有標準 JSR-107 註解的 ConcurrentHashMap
。
如果您想嘗試一下,請查看 本指南的此分支,它使用 JCache 而不是 Spring 註解(commit 32fea97 顯示了實際變更的內容)
Spring 4.1 預計於今年夏天推出,它將對其快取抽象進行重大增強;新增對 JSR-107 的支援有助於我們進一步改進這一點。還有其他一些小的增強功能,本文未涵蓋,例如更好的例外處理和 Cache
介面上方便的 putIfAbsent
方法。
與往常一樣,我們歡迎社群的回饋,請嘗試這些功能,如果遇到任何問題,請告訴我們。