Comprehensive developer toolkit providing reusable skills for Java/Spring Boot, TypeScript/NestJS/React/Next.js, Python, PHP, AWS CloudFormation, AI/RAG, DevOps, and more.
82
82%
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Risky
Do not use without reviewing
The Spring Framework provides support for transparently adding caching
to an application. At its core, the abstraction applies caching to
methods, thus reducing the number of executions based on the information
available in the cache. The caching logic is applied transparently,
without any interference to the invoker. Spring Boot auto-configures the
cache infrastructure as long as caching support is enabled by using the
org.springframework.cache.annotation.EnableCaching[format=annotation]
annotation.
[!NOTE] Check the {url-spring-framework-docs}/integration/cache.html[relevant section] of the Spring Framework reference for more details.
In a nutshell, to add caching to an operation of your service add the relevant annotation to its method, as shown in the following example:
include-code::MyMathService[]
This example demonstrates the use of caching on a potentially costly
operation. Before invoking computePiDecimal, the abstraction looks for
an entry in the piDecimals cache that matches the precision
argument. If an entry is found, the content in the cache is immediately
returned to the caller, and the method is not invoked. Otherwise, the
method is invoked, and the cache is updated before returning the value.
[!CAUTION] You can also use the standard JSR-107 (JCache) annotations (such as
javax.cache.annotation.CacheResult[format=annotation]) transparently. However, we strongly advise you to not mix and match the Spring Cache and JCache annotations.
If you do not add any specific cache library, Spring Boot
auto-configures a simple
provider that uses
concurrent maps in memory. When a cache is required (such as
piDecimals in the preceding example), this provider creates it for
you. The simple provider is not really recommended for production usage,
but it is great for getting started and making sure that you understand
the features. When you have made up your mind about the cache provider
to use, please make sure to read its documentation to figure out how to
configure the caches that your application uses. Nearly all providers
require you to explicitly configure every cache that you use in the
application. Some offer a way to customize the default caches defined by
the configprop:spring.cache.cache-names[] property.
[!TIP] It is also possible to transparently {url-spring-framework-docs}/integration/cache/annotations.html#cache-annotations-put[update] or {url-spring-framework-docs}/integration/cache/annotations.html#cache-annotations-evict[evict] data from the cache.
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.
If you have not defined a bean of type
org.springframework.cache.CacheManager[] or a org.springframework.cache.interceptor.CacheResolver[] named
cacheResolver (see
`org.springframework.cache.annotation.CachingConfigurer[]),
Spring Boot tries to detect the following providers (in the indicated
order):
io/caching.xml (EhCache 3, Hazelcast, Infinispan, and others)
Additionally, {url-spring-boot-for-apache-geode-site}[Spring Boot for Apache Geode] provides {url-spring-boot-for-apache-geode-docs}#geode-caching-provider[auto-configuration for using Apache Geode as a cache provider].
[!TIP] If the `org.springframework.cache.CacheManager[] is auto-configured by Spring Boot, it is possible to force a particular cache provider by setting the configprop:spring.cache.type[] property. Use this property if you need to use no-op caches in certain environments (such as tests).
[!TIP] Use the
spring-boot-starter-cachestarter to quickly add basic caching dependencies. The starter brings inspring-context-support. If you add dependencies manually, you must includespring-context-supportin order to use the JCache or Caffeine support.
If the org.springframework.cache.CacheManager[] is auto-configured by Spring Boot, you can further tune its configuration before it is fully initialized by exposing a bean that implements the org.springframework.boot.autoconfigure.cache.CacheManagerCustomizer[]
interface. The following example sets a flag to say that null values
should not be passed down to the underlying map:
include-code::MyCacheManagerConfiguration[]
[!NOTE] In the preceding example, an auto-configured
org.springframework.cache.concurrent.ConcurrentMapCacheManager[] is expected. If that is not the case (either you provided your own config or a different cache provider was auto-configured), the customizer is not invoked at all. You can have as many customizers as you want, and you can also order them by usingorg.springframework.core.annotation.Order[format=annotation] ororg.springframework.core.Ordered[].
Generic caching is used if the context defines at least one
org.springframework.cache.Cache[] bean. A org.springframework.cache.CacheManager[] wrapping all beans of
that type is created.
JCache is bootstrapped through
the presence of a javax.cache.spi.CachingProvider[] on the classpath (that is, a JSR-107 compliant caching library exists on the classpath), and the org.springframework.cache.jcache.JCacheCacheManager[] is
provided by the spring-boot-starter-cache starter. Various compliant
libraries are available, and Spring Boot provides dependency management
for Ehcache 3, Hazelcast, and Infinispan. Any other compliant library
can be added as well.
It might happen that more than 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 setting a cache with implementation details, as shown in the following example:
# Only necessary if more than one provider is present
spring:
cache:
jcache:
provider: "com.example.MyCachingProvider"
config: "classpath:example.xml"[!NOTE] When a cache library offers both a native implementation and JSR-107 support, Spring Boot prefers the JSR-107 support, so that the same features are available if you switch to a different JSR-107 implementation.
[!TIP] Spring Boot has general support for Hazelcast. If a single
com.hazelcast.core.HazelcastInstance[] is available, it is automatically reused for thejavax.cache.CacheManager[] as well, unless the configprop:spring.cache.jcache.config[] property is specified.
There are two ways to customize the underlying `javax.cache.CacheManager[]:
Caches can be created on startup by setting the configprop: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 javax.cache.CacheManager[] for full customization.
[!TIP] If a standard
javax.cache.CacheManager[] bean is defined, it is wrapped automatically in anorg.springframework.cache.CacheManager[] implementation that the abstraction expects. No further customization is applied to it.
Spring Boot has general support for Hazelcast. If a
com.hazelcast.core.HazelcastInstance[] has been auto-configured and com.hazelcast:hazelcast-springis on the classpath, it is automatically wrapped in aorg.springframework.cache.CacheManager[].
[!NOTE] Hazelcast can be used as a JCache compliant cache or as a Spring
org.springframework.cache.CacheManager[] compliant cache. When setting configprop:spring.cache.type[] tohazelcast, Spring Boot will use theorg.springframework.cache.CacheManager[] based implementation. If you want to use Hazelcast as a JCache compliant cache, set configprop:spring.cache.type[] tojcache. If you have multiple JCache compliant cache providers and want to force the use of Hazelcast, you have to explicitly set the JCache provider.
Infinispan has no default configuration file location, so it must be specified explicitly. Otherwise, the default bootstrap is used.
spring:
cache:
infinispan:
config: "infinispan.xml"Caches can be created on startup by setting the configprop:spring.cache.cache-names[] property. If a custom `org.infinispan.configuration.cache.ConfigurationBuilder[] bean is defined, it is used to customize the caches.
To be compatible with Spring Boot’s Jakarta EE 9 baseline, Infinispan’s
-jakarta modules must be used. For every module with a -jakarta
variant, the variant must be used in place of the standard module. For
example, infinispan-core-jakarta and infinispan-commons-jakarta must
be used in place of infinispan-core and infinispan-commons
respectively.
If Spring Data Couchbase is available and Couchbase is
configured, a
org.springframework.data.couchbase.cache.CouchbaseCacheManager[] is auto-configured. It is possible to create additional caches on startup by setting the configprop:spring.cache.cache-names[] property and cache defaults can be configured by using spring.cache.couchbase.*properties. For instance, the following configuration createscache1andcache2` caches with an entry expiration of 10 minutes:
spring:
cache:
cache-names: "cache1,cache2"
couchbase:
expiration: "10m"If you need more control over the configuration, consider registering a
org.springframework.boot.autoconfigure.cache.CouchbaseCacheManagerBuilderCustomizer[] bean. The following example shows a customizer that configures a specific entry expiration for cache1andcache2`:
include-code::MyCouchbaseCacheManagerConfiguration[]
If Redis is available and configured, a
org.springframework.data.redis.cache.RedisCacheManager[] is auto-configured. It is possible to create additional caches on startup by setting the configprop:spring.cache.cache-names[] property and cache defaults can be configured by using spring.cache.redis.*properties. For instance, the following configuration createscache1andcache2` caches with a time to live of 10 minutes:
spring:
cache:
cache-names: "cache1,cache2"
redis:
time-to-live: "10m"[!NOTE] By default, a key prefix is added so that, if two separate caches use the same key, Redis does not have overlapping keys and cannot return invalid values. We strongly recommend keeping this setting enabled if you create your own `org.springframework.data.redis.cache.RedisCacheManager[].
[!TIP] You can take full control of the default configuration by adding a
org.springframework.data.redis.cache.RedisCacheConfiguration[]org.springframework.context.annotation.Bean`[format=annotation] of your own. This can be useful if you need to customize the default serialization strategy.
If you need more control over the configuration, consider registering a
org.springframework.boot.autoconfigure.cache.RedisCacheManagerBuilderCustomizer[] bean. The following example shows a customizer that configures a specific time to live for cache1andcache2`:
include-code::MyRedisCacheManagerConfiguration[]
Caffeine is a Java 8 rewrite of
Guava’s cache that supersedes support for Guava. If Caffeine is present,
a org.springframework.cache.caffeine.CaffeineCacheManager[] (provided by the spring-boot-starter-cache` starter) is
auto-configured. Caches can be created on startup by setting the
configprop:spring.cache.cache-names[] property and can be customized
by one of the following (in the indicated order):
A cache spec defined by spring.cache.caffeine.spec
A `com.github.benmanes.caffeine.cache.CaffeineSpec[] bean is defined
A `com.github.benmanes.caffeine.cache.Caffeine[] bean is defined
For instance, the following configuration creates cache1 and cache2
caches with a maximum size of 500 and a time to live of 10 minutes
spring:
cache:
cache-names: "cache1,cache2"
caffeine:
spec: "maximumSize=500,expireAfterAccess=600s"If a com.github.benmanes.caffeine.cache.CacheLoader[] bean is defined, it is automatically associated to the org.springframework.cache.caffeine.CaffeineCacheManager[].
Since the com.github.benmanes.caffeine.cache.CacheLoader[] is going to be associated with *all* caches managed by the cache manager, it must be defined as CacheLoader<Object, Object>`. The
auto-configuration ignores any other generic type.
Cache2k is an in-memory cache. If the Cache2k
spring integration is present, a SpringCache2kCacheManager is
auto-configured.
Caches can be created on startup by setting the configprop:spring.cache.cache-names[] property. Cache defaults can be customized using a `org.springframework.boot.autoconfigure.cache.Cache2kBuilderCustomizer[] bean. The following example shows a customizer that configures the capacity of the cache to 200 entries, with an expiration of 5 minutes:
include-code::MyCache2kDefaultsConfiguration[]
If none of the other providers can be found, a simple implementation
using a java.util.concurrent.ConcurrentHashMap[] as the cache store is configured. This is the default if no caching library is present in your application. By default, caches are created as needed, but you can restrict the list of available caches by setting the cache-namesproperty. For instance, if you want onlycache1andcache2caches, set thecache-names` property as follows:
spring:
cache:
cache-names: "cache1,cache2"If you do so and your application uses a cache not listed, then it fails at runtime when the cache is needed, but not on startup. This is similar to the way the "real" cache providers behave if you use an undeclared cache.
When
org.springframework.cache.annotation.EnableCaching[format=annotation]
is present in your configuration, a suitable cache configuration is
expected as well. If you have a custom org.springframework.cache.CacheManager, consider defining it in a
separate
org.springframework.context.annotation.Configuration[format=annotation]
class so that you can override it if necessary. None uses a no-op
implementation that is useful in tests, and slice tests use that by
default via
org.springframework.boot.test.autoconfigure.core.AutoConfigureCache[format=annotation].
If you need to use a no-op cache rather than the auto-configured cache
manager in a certain environment, set the cache type to none, as shown
in the following example:
spring:
cache:
type: "none"plugins
developer-kit-ai
skills
chunking-strategy
prompt-engineering
developer-kit-aws
skills
aws
aws-cli-beast
aws-cost-optimization
aws-drawio-architecture-diagrams
aws-sam-bootstrap
aws-cloudformation
aws-cloudformation-auto-scaling
references
aws-cloudformation-bedrock
references
aws-cloudformation-cloudfront
references
aws-cloudformation-cloudwatch
references
aws-cloudformation-dynamodb
references
aws-cloudformation-ec2
aws-cloudformation-ecs
references
aws-cloudformation-elasticache
aws-cloudformation-iam
references
aws-cloudformation-lambda
references
aws-cloudformation-rds
aws-cloudformation-s3
references
aws-cloudformation-security
references
aws-cloudformation-task-ecs-deploy-gh
aws-cloudformation-vpc
developer-kit-core
skills
developer-kit-java
skills
aws-lambda-java-integration
aws-rds-spring-boot-integration
aws-sdk-java-v2-bedrock
aws-sdk-java-v2-core
aws-sdk-java-v2-dynamodb
aws-sdk-java-v2-kms
aws-sdk-java-v2-lambda
aws-sdk-java-v2-messaging
aws-sdk-java-v2-rds
aws-sdk-java-v2-s3
aws-sdk-java-v2-secrets-manager
graalvm-native-image
langchain4j
langchain4j-mcp-server-patterns
langchain4j-ai-services-patterns
references
langchain4j-mcp-server-patterns
references
langchain4j-rag-implementation-patterns
references
langchain4j-spring-boot-integration
langchain4j-testing-strategies
langchain4j-tool-function-calling-patterns
langchain4j-vector-stores-configuration
references
qdrant
references
spring-ai-mcp-server-patterns
references
spring-boot-actuator
spring-boot-cache
spring-boot-crud-patterns
spring-boot-dependency-injection
spring-boot-event-driven-patterns
spring-boot-openapi-documentation
spring-boot-project-creator
spring-boot-resilience4j
spring-boot-rest-api-standards
spring-boot-saga-pattern
spring-boot-security-jwt
assets
references
scripts
spring-boot-test-patterns
spring-data-jpa
references
spring-data-neo4j
references
unit-test-application-events
unit-test-bean-validation
unit-test-boundary-conditions
unit-test-caching
unit-test-config-properties
unit-test-controller-layer
unit-test-exception-handler
unit-test-json-serialization
unit-test-mapper-converter
unit-test-parameterized
unit-test-scheduled-async
unit-test-service-layer
unit-test-utility-methods
unit-test-wiremock-rest-api
developer-kit-php
skills
aws-lambda-php-integration
developer-kit-python
skills
aws-lambda-python-integration
developer-kit-tools
developer-kit-typescript
skills
aws-lambda-typescript-integration
better-auth
drizzle-orm-patterns
dynamodb-toolbox-patterns
references
nestjs
nestjs-best-practices
nestjs-code-review
nestjs-drizzle-crud-generator
scripts
nextjs-app-router
nextjs-authentication
nextjs-code-review
nextjs-data-fetching
references
nextjs-deployment
nextjs-performance
nx-monorepo
react-code-review
react-patterns
references
shadcn-ui
tailwind-css-patterns
references
tailwind-design-system
references
turborepo-monorepo
typescript-docs
typescript-security-review
zod-validation-utilities