Абстракция кэша предусматривает несколько вариантов интеграции с хранилищем. Чтобы использовать их, необходимо объявить соответствующий 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 3.x полностью совместим с JSR-107, и для него не требуется специальных средств поддержки.

Реализация 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 (ранее сконфигурированных в примере), обрабатывается фиктивным кэшем, который не хранит никакой информации, приводя к тому, что каждый раз будет вызываться целевой метод.