首页 新闻 会员 周边

springboot redisTemplate组件管理问题

0
悬赏园豆:10 [已解决问题] 解决于 2022-05-15 09:57

RedisConfig类如下

@Configuration
public class RedisConfig {
    private final RedisTemplate redisTemplate;

    @Autowired
    public RedisConfig(RedisTemplate redisTemplate){
        this.redisTemplate = redisTemplate;
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate(){
        RedisSerializer<String> stringRedisSerializer = new StringRedisSerializer();
        RedisSerializer<Object> objectRedisSerializer = new FastJsonRedisSerializer<>(Object.class);

        //key采用 string 的序列化方式
        redisTemplate.setStringSerializer(stringRedisSerializer);
        redisTemplate.setHashKeySerializer(stringRedisSerializer);

        //value采用 fastjson 的序列化方式
        redisTemplate.setValueSerializer(objectRedisSerializer);
        redisTemplate.setHashValueSerializer(objectRedisSerializer);

        return redisTemplate;
    }
}

此时,在其它类中使用redisTemplate只需使用@Autowried自动注入即可。
但是我在启动类中,使用容器的 getBean(RedisTemplate.class) 方法获取时,结果报错,提示有容器中有两个RedisTemplate组件。
我有一下两个疑问:
一、将RedisConfig类,改为如下,删去@Bean注解,在构造器中调用 redisTemplate()方法

@Autowired
    public RedisConfig(RedisTemplate redisTemplate){
        this.redisTemplate = redisTemplate;
        this.redisTemplate();
    }

    public RedisTemplate<String, Object> redisTemplate(){
        ~~~
    }

结果还是提示有两个组件,why?而且原来使用@Bean返回的也是从容器中拿的RedisTemplate,指向的应该是同一个对象啊。
二、既然提示有两个组件,那我再其它类中直接使用@Autowried注入RedisTemplate时为什么不报错呢?有点不能理解。

up-bear的主页 up-bear | 初学一级 | 园豆:134
提问于:2022-05-12 23:50
< >
分享
最佳答案
0

问题一:
查看 RedisAutoConfiguration redis基于springboot会加载该配置类同时创建RedisTemplate,StringRedisTemplate两个Bean,其中StringRedisTemplate继承自RedisTemplate,所以问题一,虽然取消了@Bean,但是不影响执行RedisAutoConfiguration创建两个Bean;通过容器拿RedisTemplate,若是getBean(Class<T> requiredType)肯定会报错,父子两个Bean都会找到,但是若getBean(String name)就不会。
问题二:@Autowried 是按照类型,虽然StringRedisTemplate继承自RedisTemplate,但是两个Bean类型依然不一样,所以不会导致报错。

收获园豆:10
皮蛋没有粥 | 菜鸟二级 |园豆:212 | 2022-05-13 16:12

感谢感谢,瞬间明白了。

up-bear | 园豆:134 (初学一级) | 2022-05-15 09:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册