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