如何获取Spring自动生成的RedisCacheConfiguration并扩展配置?
解决方案:基于Spring Boot配置文件扩展RedisCacheConfiguration
你的需求完全可行,不需要放弃application.properties中的spring.cache.redis.*配置,可以通过以下两种方式基于自动配置的缓存设置进行扩展:
为什么之前的方法失效
- 直接通过
@Bean创建RedisCacheConfiguration时,RedisCacheConfiguration.defaultCacheConfig()是从头构建的空配置,不会读取spring.cache.redis.*的属性,因此会覆盖自动配置的设置。 - 无法直接注入
RedisCacheConfiguration是因为Spring Boot自动配置中,该实例并非作为独立Bean注册,而是在构建RedisCacheManager的过程中内部生成的,容器中不存在可直接注入的该Bean实例。
方法一:使用RedisCacheManagerBuilderCustomizer(推荐)
这个接口允许你在自动配置构建RedisCacheManager的阶段,获取已经加载了配置文件属性的默认RedisCacheConfiguration,再对其进行自定义修改:
import org.springframework.boot.autoconfigure.cache.RedisCacheManagerBuilderCustomizer; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializationContext; @Configuration @EnableCaching public class RedisCacheConfig { @Bean public RedisCacheManagerBuilderCustomizer redisCacheManagerBuilderCustomizer() { return builder -> { // 获取自动配置加载好的默认缓存配置 RedisCacheConfiguration defaultConfig = builder.getCacheConfiguration(); // 在原有配置基础上添加自定义设置,比如更换值序列化器 RedisCacheConfiguration customizedConfig = defaultConfig .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())); // 将修改后的配置设为默认 builder.cacheDefaults(customizedConfig); // 也可以为特定缓存名单独配置(比如"userCache"缓存设置2小时过期) builder.withCacheConfiguration("userCache", customizedConfig.entryTtl(java.time.Duration.ofHours(2))); }; } }
方法二:基于RedisCacheProperties构建配置
通过注入RedisCacheProperties(自动绑定spring.cache.redis.*属性的类),基于它构建RedisCacheConfiguration,既保留配置文件设置,又能添加自定义逻辑:
import org.springframework.boot.autoconfigure.cache.RedisCacheProperties; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializationContext; @Configuration @EnableCaching public class RedisCacheConfig { @Bean public RedisCacheConfiguration redisCacheConfiguration(RedisCacheProperties properties) { // 基于配置文件属性初始化基础缓存配置 RedisCacheConfiguration config = properties.initializeConfiguration(RedisCacheConfiguration.defaultCacheConfig()); // 添加自定义配置,比如修改序列化规则 return config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())); } }
以上两种方法都能保留application.properties中的缓存配置,同时实现自定义扩展,无需完全通过代码重写所有配置。
内容的提问来源于stack exchange,提问作者Fábio
相关产品推荐
相关产品推荐

