注入的时候,关于提示redisTemplate不存在,或者RedisConnectionFactory is required的异常问题

在service层,我注入依赖:RedisTemplate<String,Ojbect> redisTemplate,会提示找不到依赖,但是RedisTemplate redisTemplate 又正常了,

而且用RedisTemplate<String,String> redisTemplate,这样注入也正常。

 

我就很奇怪了,感觉RedisTemplate<String,Ojbect> 更通用啊,为啥没有这个bean呢。

既然想不通,就决定去源码找找看。

 

首先,spring boot的依赖注入,全部是spring-boot-autoconfigure-2.3.4.RELEASE.jar里面,当然版本不限制,我这里是2.3.4,2以上应该都差不多。

这里包里面有springboot启动时候的默认需要依赖注入的配置项,redis的配置也在里面。

 

找到data/reids/RedisAutoConfiguration.class 可以看到,代码如下:

 

 

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

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

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

这个就是redis的自动配置类了,里面可以看到,配置了2个bean:

RedisTemplate<Object, Object>和StringRedisTemplate。


有的人奇怪了,那RedisTemplate<String, String>注入为啥没问题呢?
因为:

 

 

如图,也就是说:
StringRedisTemplate继承自RedisTemplate<String, String> ,当然可以用啦。

至于RedisTemplate<Object, Object> 和RedisTemplate的区别,应该不用说了。



posted @ 2021-01-28 14:58  不加班不熬夜的男子  阅读(4285)  评论(0编辑  收藏  举报