The Spring Framework provides support for transparently adding caching to an application. At its core, the abstraction applies caching to methods, reducing thus the number of executions based on the information available in the cache. The caching logic is applied transparently, without any interference to the invoker.
![]() | Note |
|---|---|
Check the relevant section of the Spring Framework reference for more details. |
In a nutshell, adding caching to an operation of your service is as easy as adding the relevant annotation to its method:
import javax.cache.annotation.CacheResult; import org.springframework.stereotype.Component; @Component public class MathService { @CacheResult public int computePiDecimal(int i) { // ... } }
![]() | Note |
|---|---|
You can either use the standard JSR-107 (JCache) annotations or Spring’s own caching annotations transparently. We strongly advise you however to not mix and match them. |
The cache abstraction does not provide an actual store and relies on abstraction
materialized by the org.springframework.cache.Cache and
org.springframework.cache.CacheManager interfaces. Spring Boot auto-configures a
suitable CacheManager according to the implementation as long as the caching support is
enabled via the @EnableCaching annotation.
![]() | Tip |
|---|---|
Use the |
Spring Boot tries to detect the following providers (in this order):
It is also possible to force the cache provider to use via the spring.cache.type
property.
Generic caching is used if the context defines at least one
org.springframework.cache.Cache bean, a CacheManager wrapping them is configured.
EhCache 2.x is used if a file named ehcache.xml can be found at the root of the
classpath. If EhCache 2.x and such file is present it is used to bootstrap the cache
manager. An alternate configuration file can be provide a well using:
spring.cache.ehcache.config=classpath:config/another-config.xmlHazelcast is used if a hazelcast.xml file can be found in the current working
directory, at the root of the classpath or a location specified via the hazelcast.config
system property. Spring Boot detects all of these and also allows for explicit location
using:
spring.cache.hazelcast.config=classpath:config/my-hazelcast.xmlInfinispan has no default configuration file location so it must be specified explicitly (or the default bootstrap is used).
spring.cache.infinispan.config=infinispan.xmlCaches can be created on startup via the spring.cache.cache-names property. If a custom
ConfigurationBuilder bean is defined, it is used to customize them.
JCache is bootstrapped via the presence of a javax.cache.spi.CachingProvider on the
classpath (i.e. a JSR-107 compliant caching library). It might happen than more that one
provider is present, in which case the provider must be explicitly specified. Even if the
JSR-107 standard does not enforce a standardized way to define the location of the
configuration file, Spring Boot does its best to accommodate with implementation details.
# Only necessary if more than one provider is present spring.cache.jcache.provider=com.acme.MyCachingProvider spring.cache.jcache.config=classpath:acme.xml
![]() | Note |
|---|---|
Since a cache library may offer both a native implementation and JSR-107 support
it is advised to set the |
There are several ways to customize the underlying javax.cache.cacheManager:
spring.cache.cache-names property. If a custom
javax.cache.configuration.Configuration bean is defined, it is used to customize them.org.springframework.boot.autoconfigure.cache.JCacheManagerCustomizer beans are
invoked with the reference of the CacheManager for full customization.![]() | Tip |
|---|---|
If a standard |
If Redis is available and configured, the RedisCacheManager is auto-configured. It is
also possible to create additional caches on startup using the spring.cache.cache-names
property.
If Guava is present, a GuavaCacheManager is auto-configured. Caches can be created
on startup using the spring.cache.cache-names property and customized by one of the
following (in this order):
spring.cache.guava.speccom.google.common.cache.CacheBuilderSpec bean is definedcom.google.common.cache.CacheBuilder bean is definedFor instance, the following configuration creates a foo and bar caches with a maximum
size of 500 and a time to live of 10 minutes
spring.cache.cache-names=foo,bar spring.cache.guava.spec=maximumSize=500,expireAfterAccess=600s
Besides, if a com.google.common.cache.CacheLoader bean is defined, it is automatically
associated to the GuavaCacheManager.