在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的區別,應該不用說了。
