注入的时候,关于提示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的区别,应该不用说了。