注入的時候,關於提示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的區別,應該不用說了。




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM