Абстракция кэша предусматривает несколько вариантов интеграции с хранилищем. Чтобы использовать их, необходимо объявить соответствующий CacheManager
(объект, который контролирует и управляет экземплярами Cache
и может использоваться для их извлечения для хранения).
JКэш на основе ConcurrentMap
из JDK
Реализация Cache
на базе JDK находится в пакете org.springframework.cache.concurrent
. Она позволяет использовать ConcurrentHashMap
в качестве резервного хранилища для Cache
. В следующем примере показано, как сконфигурировать два кэша:
<!-- простой диспетчер кэша -->
<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
<property name="caches">
<set>
<bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="default"/>
<bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="books"/>
</set>
</property>
</bean>
В предыдущем фрагменте SimpleCacheManager
использован для создания CacheManager
для двух вложенных экземпляров ConcurrentMapCache
с именами default
и books
. Обратите внимание, что имена конфигурируются непосредственно для каждого кэша.
Поскольку кэш создается приложением, он привязан к его жизненному циклу, что делает его подходящим для базовых сценариев использования, тестов или простых приложений. Кэш отлично масштабируется и работает крайне быстро, но не предусматривает никаких возможностей управления, постоянного хранения или контрактов вытеснения.
Кэш на основе Ehcache
Реализация Ehcache 2.x находится в пакете org.springframework.cache.ehcache
. Опять же, чтобы использовать эту реализацию, необходимо объявить соответствующий CacheManager
. В следующем примере показано, как это сделать:
<bean id="cacheManager"
class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cache-manager-ref="ehcache"/>
<!-- Настройка библиотеки EhCache -->
<bean id="ehcache"
class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:config-location="ehcache.xml"/>
Эта настройка загружает библиотеку ehcache внутри IoC-контейнера Spring (через бин ehcache
), которая затем подключается к специальной реализации CacheManager
. Обратите внимание, что вся конфигурация, ориентированная на Ehcache, считывается из ehcache.xml
.
Кэш Caffeine
Caffeine – это переработанный на Java 8 кэш Guava, его реализация находится в пакете org.springframework.cache.caffeine
и предоставляет доступ к нескольким функциям из Caffeine.
В следующем примере сконфигурирован CacheManager
, который создает кэш по требованию:
<bean id="cacheManager"
class="org.springframework.cache.caffeine.CaffeineCacheManager"/>
Вы также можете задать кэши для использования в явном виде. В этом случае диспетчер будет предоставлять доступ только к ним. В следующем примере показано, как это сделать:
<bean id="cacheManager" class="org.springframework.cache.caffeine.CaffeineCacheManager">
<property name="cacheNames">
<set>
<value>default</value>
<value>books</value>
</set>
</property>
</bean>
CacheManager
из Caffeine также поддерживает кастомные Caffeine
и CacheLoader
. Более подробную информацию о них можно найти в документации по Caffeine.
Кэш на основе GemFire
GemFire – это база данных, ориентированная на работу с памятью, поддерживающая резервирование на диске, гибко масштабируемая, доступная на постоянной основе, активная (со встроенными уведомлениями о подписке на основе шаблонов), глобально реплицируемая и обеспечивающая полнофункциональное пограничное кэширование.
Кэш JSR-107
Абстракция кэширования Spring также может использовать кэши, соответствующие стандарту JSR-107. Реализация JCache находится в пакете org.springframework.cache.jcache
.
Опять же, чтобы использовать эту реализацию, необходимо объявить соответствующий CacheManager
. В следующем примере показано, как это сделать:
<bean id="cacheManager"
class="org.springframework.cache.jcache.JCacheCacheManager"
p:cache-manager-ref="jCacheManager"/>
<!-- Настройка диспетчера кэша JSR-107 -->
<bean id="jCacheManager" .../>
Работа с кэшем без резервного хранилища
Иногда, при смене окружения или тестировании, можно работать с объявлениями кэша без фактически сконфигурированного резервного кэша. Поскольку это недопустимая конфигурация, во время выполнения генерируется исключение, поскольку инфраструктура кэширования не может найти подходящее хранилище. В подобных ситуациях, вместо того, чтобы удалять объявления кэша (что может оказаться трудоёмким процессом), можно подключить простой фиктивный кэш, который не выполняет никакого кэширования – то есть делает так, что каждый раз вызываются кэшированные методы. В следующем примере показано, как это сделать:
<bean id="cacheManager" class="org.springframework.cache.support.CompositeCacheManager">
<property name="cacheManagers">
<list>
<ref bean="jdkCache"/>
<ref bean="gemfireCache"/>
</list>
</property>
<property name="fallbackToNoOpCache" value="true"/>
</bean>
CompositeCacheManager
в предыдущем примере объединяет несколько экземпляров CacheManager
и, посредством флага fallbackToNoOpCache
, добавляет фиктивный кэш для всех определений, не обработанных сконфигурированными диспетчерами кэша. То есть каждое определение кэша, не найденное ни в jdkCache
, ни в gemfireCache
(ранее сконфигурированных в примере), обрабатывается фиктивным кэшем, который не хранит никакой информации, приводя к тому, что каждый раз будет вызываться целевой метод.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ