此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.1.10! |
此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.1.10! |
缓存抽象提供了多个存储集成选项。要使用它们,您需要
声明适当的(控制和管理实例的实体,可用于检索这些实例进行存储)。CacheManager
Cache
基于 JDK 的缓存ConcurrentMap
基于 JDK 的实现位于 package 下。它允许您用作后备存储。以下示例演示如何配置两个缓存:Cache
org.springframework.cache.concurrent
ConcurrentHashMap
Cache
-
Java
-
Kotlin
-
Xml
@Bean
ConcurrentMapCacheFactoryBean defaultCache() {
ConcurrentMapCacheFactoryBean cache = new ConcurrentMapCacheFactoryBean();
cache.setName("default");
return cache;
}
@Bean
ConcurrentMapCacheFactoryBean booksCache() {
ConcurrentMapCacheFactoryBean cache = new ConcurrentMapCacheFactoryBean();
cache.setName("books");
return cache;
}
@Bean
CacheManager cacheManager(ConcurrentMapCache defaultCache, ConcurrentMapCache booksCache) {
SimpleCacheManager cacheManager = new SimpleCacheManager();
cacheManager.setCaches(Set.of(defaultCache, booksCache));
return cacheManager;
}
@Bean
fun defaultCache(): ConcurrentMapCacheFactoryBean {
return ConcurrentMapCacheFactoryBean().apply {
setName("default")
}
}
@Bean
fun booksCache(): ConcurrentMapCacheFactoryBean {
return ConcurrentMapCacheFactoryBean().apply {
setName("books")
}
}
@Bean
fun cacheManager(defaultCache: ConcurrentMapCache, booksCache: ConcurrentMapCache): CacheManager {
return SimpleCacheManager().apply {
setCaches(setOf(defaultCache, booksCache))
}
}
<!-- simple cache manager -->
<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
<property name="caches">
<set>
<bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" name="default"/>
<bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" name="books"/>
</set>
</property>
</bean>
前面的代码片段使用 为
两个名为 和 的嵌套实例。请注意,
直接为每个缓存配置名称。SimpleCacheManager
CacheManager
ConcurrentMapCache
default
books
由于缓存是由应用程序创建的,因此它绑定到其生命周期,使其 适用于基本用例、测试或简单应用程序。缓存扩展性好 并且速度非常快,但它不提供任何管理、持久性功能、 或驱逐合同。
基于 Ehcache 的缓存
Ehcache 3.x 完全符合 JSR-107 标准,不需要专门的支持。有关详细信息,请参见 JSR-107 缓存。
咖啡因缓存
Caffeine 是 Guava 缓存的 Java 8 重写,它的实现位于包中,提供对多个功能的访问
咖啡因。org.springframework.cache.caffeine
以下示例配置按需创建缓存:CacheManager
-
Java
-
Kotlin
-
Xml
@Bean
CacheManager cacheManager() {
return new CaffeineCacheManager();
}
@Bean
fun cacheManager(): CacheManager {
return CaffeineCacheManager()
}
<bean id="cacheManager" class="org.springframework.cache.caffeine.CaffeineCacheManager"/>
您还可以提供要显式使用的缓存。在这种情况下,只有那些 由经理提供。以下示例演示如何执行此操作:
-
Java
-
Kotlin
-
Xml
@Bean
CacheManager cacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager();
cacheManager.setCacheNames(List.of("default", "books"));
return cacheManager;
}
@Bean
fun cacheManager(): CacheManager {
return CaffeineCacheManager().apply {
cacheNames = listOf("default", "books")
}
}
<bean id="cacheManager" class="org.springframework.cache.caffeine.CaffeineCacheManager">
<property name="cacheNames">
<set>
<value>default</value>
<value>books</value>
</set>
</property>
</bean>
Caffeine 还支持自定义和 .
有关这些内容的更多信息,请参阅 Caffeine 文档。CacheManager
Caffeine
CacheLoader
基于 GemFire 的缓存
GemFire 是一个面向内存、磁盘支持、可弹性扩展、持续可用的
活动(带有基于模式的内置订阅通知),全局复制
数据库,并提供功能齐全的边缘缓存。有关如何执行操作的详细信息
将 GemFire 用作(以及更多),请参阅 Spring Data GemFire 参考文档。CacheManager
JSR-107 缓存
Spring 的缓存抽象也可以使用符合 JSR-107 的缓存。The JCache
实现位于包中。org.springframework.cache.jcache
同样,要使用它,您需要声明适当的 .
以下示例演示如何执行此操作:CacheManager
-
Java
-
Kotlin
-
Xml
@Bean
javax.cache.CacheManager jCacheManager() {
CachingProvider cachingProvider = Caching.getCachingProvider();
return cachingProvider.getCacheManager();
}
@Bean
org.springframework.cache.CacheManager cacheManager(javax.cache.CacheManager jCacheManager) {
return new JCacheCacheManager(jCacheManager);
}
@Bean
fun jCacheManager(): javax.cache.CacheManager {
val cachingProvider = Caching.getCachingProvider()
return cachingProvider.getCacheManager()
}
@Bean
fun cacheManager(jCacheManager: javax.cache.CacheManager): org.springframework.cache.CacheManager {
return JCacheCacheManager(jCacheManager)
}
<bean id="cacheManager"
class="org.springframework.cache.jcache.JCacheCacheManager"
p:cache-manager-ref="jCacheManager"/>
<!-- JSR-107 cache manager setup -->
<bean id="jCacheManager" .../>
在没有后备存储的情况下处理缓存
有时,在切换环境或进行测试时,可能会有缓存 声明,但未配置实际的后备缓存。因为这是一个无效的 配置时,由于缓存基础结构 找不到合适的店铺。在这种情况下,与其删除 缓存声明(这可能被证明是乏味的),您可以连接一个简单的虚拟缓存 不执行缓存 — 也就是说,它强制每次都调用缓存的方法。 以下示例演示如何执行此操作:
-
Java
-
Kotlin
-
Xml
@Bean
CacheManager cacheManager(CacheManager jdkCache, CacheManager gemfireCache) {
CompositeCacheManager cacheManager = new CompositeCacheManager();
cacheManager.setCacheManagers(List.of(jdkCache, gemfireCache));
cacheManager.setFallbackToNoOpCache(true);
return cacheManager;
}
@Bean
fun cacheManager(jdkCache: CacheManager, gemfireCache: CacheManager): CacheManager {
return CompositeCacheManager().apply {
setCacheManagers(listOf(jdkCache, gemfireCache))
setFallbackToNoOpCache(true)
}
}
<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>
在前面的链中,多个实例和,
通过标志,为所有定义添加一个 no-op 缓存 not
由配置的缓存管理器处理。也就是说,在
或(在示例前面配置)由
no-op 缓存,它不存储任何信息,导致目标方法
每次调用。CompositeCacheManager
CacheManager
fallbackToNoOpCache
jdkCache
gemfireCache