- 1 Spring Boot文档
- 1.1 关于这篇文档
- 1.2 获取帮助
- 1.3 第一步
- 1.4 使用Spring Boot
- 1.5 了解Spring Boot功能
- 1.6 转向生产
- 1.7 深入问题
- 2 入门
- 2.1 Spring Boot介绍
- 2.2 系统要求
- 2.3 安装Spring Boot
- 2.4 开发您的第一个Spring Boot应用程序
- 2.5 接下来要阅读的内容
- 3 使用Spring Boot
- 3.1 构建系统
- 3.1.1 依赖管理
- 3.2 结构化您的代码
- 3.3 配置类
- 3.4 自动配置
- 3.5 Spring Beans和依赖注入
- 3.6 使用@SpringBootApplication注解
- 3.7 运行您的应用程序
- 3.8 开发者工具
- 3.9 打包用于生产中的应用
- 3.10 接下来要阅读的内容
- 4 Spring Boot功能
- 4.1 SpringApplication
- 4.2 外部配置
- 4.3 Profiles
- 4.4 日志
- 4.5 国际化
- 4.6 JSON
- 4.7 开发Web应用程序
- 4.8 安全
- 4.9 使用SQL数据库
- 4.10 使用NoSQL技术
- 4.11 缓存
- 4.12 消息
- 4.13 使用RestTemplate调用REST服务
- 4.14 使用WebClient调用REST服务
- 4.15 校验
- 4.16 发送邮件
- 4.17 使用JTA的分布式事务
- 4.18 Hazelcast
- 4.19 Quartz Scheduler
- 4.20 任务执行和调度
- 4.21 Spring Integration
- 4.22 Spring Session
- 4.23 JMX的监控和管理
- 4.23 测试
- 4.25 WebSockets
- 4.26 Web Service
- 4.27 创建自己的自动配置
- 4.28 Kotlin支持
- 4.29 接下来要阅读的内容
- 5 Spring Boot Actuator: 生产就绪功能
- 5.1 启用生产就绪功能
- 5.2 Endpoints
- 5.3 通过HTTP进行监控和管理
- 5.4 JMX的监控和管理
- 5.5 Loggers
- 5.6 Metrics
- 5.7 审计
- 5.8 HTTP跟踪
- 5.9 进程监控
- 5.10 Cloud Foundry支持
- 5.11 接下来要阅读的内容
- 6 部署Spring Boot应用程序
- 6.1 部署到Cloud
- 6.2 安装Spring Boot应用程序
- 6.3 接下来要阅读的内容
- 7 Spring Boot CLI
- 7.1 安装CLI
- 7.2 使用CLI
- 7.3 使用Groovy Bean DSL开发应用程序
- 7.4 使用settings.xml配置CLI
- 7.5 接下来要阅读的内容
- 8 构建工具插件
- 8.1 Spring Boot Maven插件
- 8.2 Spring Boot Gradle插件
- 8.3 Spring Boot AntLib模块
- 8.4 支持其他构建系统
- 8.5 接下来要阅读的内容
- 9 ‘How-to’ 指南
- 9.1 Spring Boot应用
- 9.2 属性和配置
- 9.3 嵌入式Web服务器
- 9.4 Spring MVC
4.11 缓存
Spring Framework支持透明地向应用程序添加缓存。 从本质上讲,抽象将缓存应用于方法,从而根据缓存中可用的信息减少执行次数。 缓存逻辑是透明应用的,不会对调用者造成任何干扰。 只要通过@EnableCaching批注启用了缓存支持,Spring Boot就会自动配置缓存基础结构。
有关更多详细信息,请查看Spring Framework参考的相关部分.
简而言之,将缓存添加到服务操作就像在其方法中添加相关注释一样简单,如以下示例所示:
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;
@Component
public class MathService {
@Cacheable("piDecimals")
public int computePiDecimal(int i) {
// ...
}
}
此示例演示了如何在可能代价高昂的操作上使用缓存。 在调用computePiDecimal之前,抽象在piDecimals缓存中查找与i参数匹配的条目。 如果找到条目,则缓存中的内容会立即返回给调用者,并且不会调用该方法。 否则,将调用该方法,并在返回值之前更新缓存。
您还可以透明地使用标准JSR-107(JCache)注释(例如@CacheResult)。 但是,我们强烈建议您不要混淆和匹配Spring Cache和JCache注释.
如果您不添加任何特定的缓存库,Spring Boot会自动配置一个在内存中使用并发映射的简单提供程序。 当需要缓存时(例如前面示例中的piDecimals),此提供程序会为您创建缓存。 简单的提供程序并不是真正推荐用于生产用途,但它非常适合入门并确保您了解这些功能。 当您决定使用缓存提供程序时,请务必阅读其文档以了解如何配置应用程序使用的缓存。 几乎所有提供程序都要求您显式配置在应用程序中使用的每个缓存。 有些提供了一种自定义spring.cache.cache-names属性定义的默认缓存的方法。
还可以透明地更新或逐出缓存中的数据.
4.11.1 支持的缓存提供程序
缓存抽象不提供实际存储,而是依赖于org.springframework.cache.Cache和org.springframework.cache.CacheManager接口实现的抽象。
如果您尚未定义CacheManager类型的bean或名为cacheResolver的CacheResolver(请参阅CachingConfigurer),则Spring Boot会尝试检测以下提供程序(按指示的顺序):
- Generic
- JCache (JSR-107) (EhCache 3, Hazelcast, Infinispan, 和其他)
- EhCache 2.x
- Hazelcast
- Infinispan
- Couchbase
- Redis
- Caffeine
- Simple
也可以通过设置spring.cache.type属性来强制特定的缓存提供程序。 如果需要在某些环境(例如测试)中完全禁用缓存,请使用此属性.
使用spring-boot-starter-cache“Starter”快速添加基本缓存依赖项。 Starter带来了spring环境支持。 如果手动添加依赖项,则必须包含spring-context-support才能使用JCache,EhCache 2.x或Guava支持.
如果通过Spring Boot自动配置CacheManager,则可以通过公开实现CacheManagerCustomizer接口的bean,在完全初始化之前进一步调整其配置。 以下示例设置一个标志,表示应将null值传递给底层映射:
@Bean
public CacheManagerCustomizer<ConcurrentMapCacheManager> cacheManagerCustomizer() {
return new CacheManagerCustomizer<ConcurrentMapCacheManager>() {
@Override
public void customize(ConcurrentMapCacheManager cacheManager) {
cacheManager.setAllowNullValues(false);
}
};
}
在前面的示例中,需要自动配置的ConcurrentMapCacheManager。 如果不是这种情况(您提供了自己的配置或自动配置了不同的缓存提供程序),则根本不会调用自定义程序。 您可以拥有任意数量的自定义程序,也可以使用@Order或Ordered排序它们.
4.11.1.1 Generic
如果上下文定义了至少一个org.springframework.cache.Cache bean,则使用通用缓存。 将创建一个包装该类型所有bean的CacheManager。
4.11.1.2 JCache (JSR-107)
JCache是通过类路径上的javax.cache.spi.CachingProvider(即类路径上存在JSR-107兼容的缓存库)来引导的,而JCacheCacheManager是由spring-boot-starter-cache提供的“ Starter”。 可以使用各种兼容库,Spring Boot为Ehcache 3,Hazelcast和Infinispan提供依赖管理。 还可以添加任何其他兼容库。
可能会出现多个提供程序,在这种情况下,必须明确指定提供程序。 即使JSR-107标准没有强制执行定义配置文件位置的标准化方法,Spring Boot也会尽力满足设置缓存的实现细节,如下例所示:
# Only necessary if more than one provider is present
spring.cache.jcache.provider=com.acme.MyCachingProvider
spring.cache.jcache.config=classpath:acme.xml
当缓存库同时提供本机实现和JSR-107支持时,Spring Boot更喜欢JSR-107支持,因此如果切换到不同的JSR-107实现,则可以使用相同的功能.
Spring Boot对Hazelcast有一般支持。 如果单个HazelcastInstance可用,它也会自动重用于CacheManager,除非指定了spring.cache.jcache.config属性.
有两种方法可以自定义底层的javax.cache.cacheManager:
- 可以通过设置spring.cache.cache-names属性在启动时创建缓存。 如果定义了自定义javax.cache.configuration.Configuration bean,则会使用它来自定义它们。
- 使用CacheManager的引用调用org.springframework.boot.autoconfigure.cache.JCacheManagerCustomizer bean以进行完全自定义。
如果定义了标准的javax.cache.CacheManager bean,它将自动包装在抽象所需的org.springframework.cache.CacheManagerimplementation中。 没有对其应用的进一步自定义.
4.11.1.3 EhCache 2.x
如果可以在类路径的根目录中找到名为ehcache.xml的文件,则使用EhCache 2.x. 如果找到EhCache 2.x,则使用spring-boot-starter-cache“Starter”提供的EhCacheCacheManager来引导缓存管理器。 还可以提供备用配置文件,如以下示例所示:
spring.cache.ehcache.config=classpath:config/another-config.xml
4.11.1.4 Hazelcast
Spring Boot对Hazelcast有一般支持。 如果已自动配置HazelcastInstance,则会自动将其包装在CacheManager中。
4.11.1.5 Infinispan
Infinispan没有默认配置文件位置,因此必须明确指定。 否则,使用默认引导程序。
spring.cache.infinispan.config=infinispan.xml
可以通过设置spring.cache.cache-names属性在启动时创建缓存。 如果定义了自定义ConfigurationBuilder bean,则它用于自定义缓存。
Infinispan在Spring Boot中的支持仅限于嵌入式模式,非常基础。 如果你想要更多选项,你应该使用官方的Infinispan Spring Boot启动器。 有关更多详细信息,请参阅Infinispan的文档.
4.11.1.6 Couchbase
如果Couchbase Java客户端和couchbase-spring-cache实现可用且配置了Couchbase,则会自动配置CouchbaseCacheManager。 也可以通过设置spring.cache.cache-names属性在启动时创建其他缓存。 这些缓存在自动配置的Bucket上运行。 您还可以使用自定义程序在另一个Bucket上创建其他缓存。 假设您需要在“主”Bucket和一个(cache3)缓存上使用两个缓存(cache1和cache2),并在“另一个”Bucket上生成2秒的自定义时间。 您可以通过配置创建前两个缓存,如下所示:
spring.cache.cache-names=cache1,cache2
然后,您可以定义一个@Configuration类来配置额外的Bucket和cache3缓存,如下所示:
@Configuration
public class CouchbaseCacheConfiguration {
private final Cluster cluster;
public CouchbaseCacheConfiguration(Cluster cluster) {
this.cluster = cluster;
}
@Bean
public Bucket anotherBucket() {
return this.cluster.openBucket("another", "secret");
}
@Bean
public CacheManagerCustomizer<CouchbaseCacheManager> cacheManagerCustomizer() {
return c -> {
c.prepareCache("cache3", CacheBuilder.newInstance(anotherBucket())
.withExpiration(2));
};
}
}
此示例配置重用通过自动配置创建的群集。
4.11.1.7 Redis
如果Redis可用并已配置,则会自动配置RedisCacheManager。 通过设置spring.cache.cache-names属性可以在启动时创建其他缓存,并且可以使用spring.cache.redis.*属性配置缓存默认值。 例如,以下配置创建cache1和cache2缓存,其生存时间为10分钟:
spring.cache.cache-names=cache1,cache2
spring.cache.redis.time-to-live=600000
默认情况下,会添加一个键前缀,这样,如果两个单独的缓存使用相同的键,则Redis没有重叠键,也不能返回无效值。 如果您创建自己的RedisCacheManager,我们强烈建议您启用此设置.
您可以通过添加自己的RedisCacheConfiguration @Bean来完全控制配置。 如果您正在寻找自定义序列化策略,这可能很有用.
4.11.1.8 Caffeine
Caffeine是Java 8重写的Guava缓存,取代了对Guava的支持。 如果存在Caffeine,则会自动配置CaffeineCacheManager(由spring-boot-starter-cache“Starter”提供)。 可以通过设置spring.cache.cache-names属性在启动时创建缓存,并且可以通过以下之一(按指示的顺序)自定义缓存:
- 由spring.cache.caffeine.spec定义的缓存规范
- 定义了com.github.benmanes.caffeine.cache.CaffeineSpec bean
- 定义了com.github.benmanes.caffeine.cache.Caffeine bean
例如,以下配置创建cache1和cache2缓存,最大大小为500,生存时间为10分钟
spring.cache.cache-names=cache1,cache2
spring.cache.caffeine.spec=maximumSize=500,expireAfterAccess=600s
如果定义了com.github.benmanes.caffeine.cache.CacheLoader bean,它将自动与CaffeineCacheManager关联。 由于CacheLoader将与缓存管理器管理的所有缓存相关联,因此必须将其定义为CacheLoader <Object,Object>。 自动配置忽略任何其他泛型类型。
4.11.1.9 Simple
如果找不到其他提供程序,则配置使用ConcurrentHashMap作为缓存存储的简单实现。 如果应用程序中不存在缓存库,则这是默认值。 默认情况下,会根据需要创建高速缓存,但您可以通过设置cache-names属性来限制可用高速缓存的列表。 例如,如果只需要cache1和cache2缓存,请按如下所示设置cache-names属性:
spring.cache.cache-names=cache1,cache2
如果这样做并且您的应用程序使用未列出的缓存,则在需要缓存时它会在运行时失败,但在启动时则不会。 这类似于“real”缓存提供程序在使用未声明的缓存时的行为方式。
4.11.1.10 None
当配置中存在@EnableCaching时,也需要合适的缓存配置。 如果需要在某些环境中完全禁用缓存,请将缓存类型强制为none以使用no-op实现,如以下示例所示:
spring.cache.type=none
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论