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时为什么不报错呢?有点不能理解。
问题一:
查看 RedisAutoConfiguration redis基于springboot会加载该配置类同时创建RedisTemplate,StringRedisTemplate两个Bean,其中StringRedisTemplate继承自RedisTemplate,所以问题一,虽然取消了@Bean,但是不影响执行RedisAutoConfiguration创建两个Bean;通过容器拿RedisTemplate,若是getBean(Class<T> requiredType)肯定会报错,父子两个Bean都会找到,但是若getBean(String name)就不会。
问题二:@Autowried 是按照类型,虽然StringRedisTemplate继承自RedisTemplate,但是两个Bean类型依然不一样,所以不会导致报错。
感谢感谢,瞬间明白了。