Spring Boot集成同步与Reactive Redis时的Bean冲突问题
问题场景
在Spring Boot 2.7.3项目中,原有同步Redis基于JedisConnectionFactory和RedisTemplate实现,新增Reactive Redis的ReactiveRedisConnectionFactory和ReactiveRedisTemplate后出现两类异常:
- 自定义
ReactiveRedisTemplate时,抛出NoUniqueBeanDefinitionException,提示存在reactiveRedisTemplate和reactiveStringRedisTemplate两个同类型Bean - 删除自定义
ReactiveRedisTemplate后,抛出NoSuchBeanDefinitionException,找不到ReactiveRedisTemplate<String, String>类型的Bean
原因分析
异常1的根源
Spring Boot的RedisReactiveAutoConfiguration自动配置类会自动生成ReactiveStringRedisTemplate Bean,而ReactiveStringRedisTemplate是ReactiveRedisTemplate<String, String>的子类。当你手动定义ReactiveRedisTemplate<String, String>类型的Bean时,容器中会存在两个同类型的实例:
- 你自定义的
reactiveRedisTemplate - 自动配置生成的
reactiveStringRedisTemplate
Spring按类型注入时无法确定优先级,因此抛出Bean重复定义异常。
异常2的根源
删除自定义ReactiveRedisTemplate后,自动配置创建的ReactiveStringRedisTemplate Bean名称为reactiveStringRedisTemplate,且Spring默认严格匹配Bean类型。如果你的代码是:
- 按
ReactiveRedisTemplate<String, String>类型注入(子类向上转型的匹配逻辑未触发) - 按名称
reactiveRedisTemplate注入
就会出现找不到对应Bean的异常。
解决方法
方案1:标记自定义Bean为优先选择(解决异常1)
在自定义的ReactiveRedisTemplate Bean上添加@Primary注解,让Spring注入时优先选择你的自定义实例:
@Bean @Primary public ReactiveRedisTemplate<String, String> reactiveRedisTemplate(ReactiveRedisConnectionFactory factory) { RedisSerializationContext.RedisSerializationContextBuilder<String, String> builder = RedisSerializationContext.newSerializationContext(new StringRedisSerializer()); RedisSerializationContext<String, String> context = builder.value(new StringRedisSerializer()).build(); return new ReactiveRedisTemplate<>(factory, context); }
方案2:禁用自动配置的Reactive Redis Bean
通过@SpringBootApplication的exclude属性排除RedisReactiveAutoConfiguration,完全手动控制Reactive Redis的Bean创建:
@SpringBootApplication(exclude = RedisReactiveAutoConfiguration.class) public class YourApplication { // 项目启动逻辑 }
方案3:适配自动配置的Bean(解决异常2)
如果你的序列化需求与自动配置的ReactiveStringRedisTemplate一致(均为String类型序列化),可以直接注入ReactiveStringRedisTemplate:
@Autowired private ReactiveStringRedisTemplate reactiveStringRedisTemplate;
或者通过@Qualifier指定Bean名称,注入为ReactiveRedisTemplate<String, String>类型:
@Autowired @Qualifier("reactiveStringRedisTemplate") private ReactiveRedisTemplate<String, String> reactiveRedisTemplate;
额外说明
- 同步Redis用
JedisConnectionFactory、Reactive Redis用LettuceConnectionFactory完全兼容,两者可共存于同一项目 - 确保项目依赖包含
spring-boot-starter-data-redis-reactive,否则Reactive Redis的自动配置不会生效
内容的提问来源于stack exchange,提问作者mpartan

