注入的时候,关于提示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的区别,应该不用说了。
浙公网安备 33010602011771号