springboot的RedisTemplate自定义泛型自动注入问题

2,411 阅读1分钟

Springboot 调用 Reids 模板对象 RedisTemplate 时遇到了无法自动注入自定义泛型的问题。仅可以RedisTemplate<Object, Object>RedisTemplate<String, String>这两种方式自动注入。

1、查看 Springboot 默认配置

@Configuration(
    proxyBeanMethods = false
)
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
    public RedisAutoConfiguration() {
    }

    @Bean
    @ConditionalOnMissingBean(
        name = {"redisTemplate"}
    )
    @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }

    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}

可以看到 springboot 默认情况下为我们定义了 RedisTemplate<Object, Object>StringRedisTemplate 两个类型的 bean, 如果不定义自己的 RedisTemplate,@Autowired 只能这样注入,不能使用其他的泛型注入。

  • 因为 @Autowired 是按类型注入

  • 解决办法: 可以用 @Resource 注入,并且自定义的对象需要实现 Serializable 接口,因为 Spring 会将对象先序列化再存入 Redis。