对于最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

配置缓存存储

缓存抽象提供了多种存储集成选项。要使用这些选项,您需要声明一个合适的CacheManager(一个用于控制和管理Cache实例的实体,并可用于检索这些实例以进行存储)。spring-doc.cadn.net.cn

JDKConcurrentMap基于缓存

基于 JDK 的 Cache 实现位于 org.springframework.cache.concurrent 包中。它允许你使用 ConcurrentHashMap 作为底层的 Cache 存储。以下示例展示了如何配置两个缓存:spring-doc.cadn.net.cn

<!-- simple cache manager -->
<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,用于管理两个名为 ConcurrentMapCachedefault 的嵌套 books 实例。请注意,每个缓存的名称是直接配置的。spring-doc.cadn.net.cn

由于缓存由应用程序创建,因此其生命周期与应用程序绑定,适用于基本用例、测试或简单应用程序。该缓存具有良好的可扩展性且速度非常快,但不提供任何管理功能、持久化能力或淘汰策略。spring-doc.cadn.net.cn

基于 Ehcache 的缓存

Ehcache 3.x 完全符合 JSR-107 规范,无需为其提供专门的支持。详情请参见 JSR-107 缓存spring-doc.cadn.net.cn

Caffeine 缓存

Caffeine 是 Guava 缓存库基于 Java 8 的重写版本,其实现位于 org.springframework.cache.caffeine 包中,并提供了对 Caffeine 多项特性的访问支持。spring-doc.cadn.net.cn

以下示例配置了一个按需创建缓存的CacheManagerspring-doc.cadn.net.cn

<bean id="cacheManager"
		class="org.springframework.cache.caffeine.CaffeineCacheManager"/>

你也可以显式地指定要使用的缓存。在这种情况下,管理器仅提供这些缓存。以下示例展示了如何实现这一点:spring-doc.cadn.net.cn

<bean id="cacheManager" class="org.springframework.cache.caffeine.CaffeineCacheManager">
	<property name="cacheNames">
		<set>
			<value>default</value>
			<value>books</value>
		</set>
	</property>
</bean>

Caffeine 的 CacheManager 还支持自定义的 CaffeineCacheLoader。 有关这些内容的更多信息,请参阅Caffeine 文档spring-doc.cadn.net.cn

基于 GemFire 的缓存

GemFire 是一种以内存为中心、磁盘持久化、弹性可扩展、持续可用的数据库,支持主动模式(内置基于模式的订阅通知),并提供全局复制功能,同时还具备完整的边缘缓存特性。有关如何将 GemFire 用作 CacheManager(及其他更多内容)的详细信息,请参阅Spring Data GemFire 参考文档spring-doc.cadn.net.cn

JSR-107 缓存

Spring 的缓存抽象也可以使用符合 JSR-107 规范的缓存。JCache 实现位于 org.springframework.cache.jcache 包中。spring-doc.cadn.net.cn

同样,要使用它,你需要声明相应的CacheManager。 以下示例展示了如何进行声明:spring-doc.cadn.net.cn

<bean id="cacheManager"
		class="org.springframework.cache.jcache.JCacheCacheManager"
		p:cache-manager-ref="jCacheManager"/>

<!-- JSR-107 cache manager setup  -->
<bean id="jCacheManager" .../>

处理没有后端存储的缓存

有时,在切换环境或进行测试时,你可能会有缓存声明,但并未配置实际的底层缓存。由于这是一种无效的配置,运行时会抛出异常,因为缓存基础设施无法找到合适的存储。在这种情况下,与其移除缓存声明(这可能很繁琐),不如注入一个简单的虚拟缓存,它不执行任何缓存操作——也就是说,它会强制每次调用被缓存的方法。 以下示例展示了如何实现这一点:spring-doc.cadn.net.cn

<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 标志,为所有未被已配置的缓存管理器处理的缓存定义添加一个无操作(no-op)缓存。也就是说,任何在 jdkCachegemfireCache(在示例中先前已配置)中都找不到的缓存定义,都将由这个无操作缓存处理——该缓存不会存储任何信息,从而导致目标方法每次都会被调用。spring-doc.cadn.net.cn