Springboot的redisTemplate究竟用的是哪个bean

这篇具有很好参考价值的文章主要介绍了Springboot的redisTemplate究竟用的是哪个bean。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在自动装配一个RedisTemplate对象时,我时常有疑惑用到的究竟是spring自带的还是我们自定义的。

不定义自定义bean时
@Autowired
private RedisTemplate redisTemplate;

上面的redisTemplate实际上是RedisAutoConfiguration类中通过redisTempate这个bean自动装载的。

@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
	RedisTemplate<Object, Object> template = new RedisTemplate<>();
	template.setConnectionFactory(redisConnectionFactory);
	return template;
}

@Bean
@ConditionalOnMissingBean
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
	StringRedisTemplate template = new StringRedisTemplate();
	template.setConnectionFactory(redisConnectionFactory);
	return template;
}

由于该类中还定义了stringRedisTemplate的bean,所以下面的自动装配得到的就是该bean

@Autowired
private RedisTemplate stringRedisTemplate;

注意:句柄必须是stringRedisTemplate,这个句柄对应的是bean的名字。

但是只是通过句柄来确定用的是哪个bean,未免有点不太严谨,因为在我有限的认知中,句柄只是句柄而已,改成其他字符串它还是一个句柄。但是你会发现改了句柄之后就会报错了。

有两种方式可以解决:

1,使用@Qualifier注解

2,将RedisTemplate泛型定义完整,此时句柄可以随便修改

@Autowired
private RedisTemplate<String, String> whichRedisTemplate;

可以得出结论:究竟用的是哪个bean,可以由下面3步来确定

1,@Qualifer注解中标明的bean名字

2,定义的泛型

3,句柄名字

注意:上面3步是由优先顺序的。

如果有好奇下面的定义是用的哪个bean的,可以直接给出答案,是RedisAutoConfiguration类中的redisTempate。

@Autowired
private RedisTemplate<Object,Object> stringRedisTemplate;
有定义自定义bean时

首先我们是不能定义相同的bean名字的。因为已经有了RedisAutoConfiguration类中定义的两个bean,也就是说我们不能再定义名称为redisTemplate或stringRedisTemplate的bean,不然会抛出BeanDefinitionOverrideException

有自定义bean时确定用到的时哪个bean的方法还是前面3步。值得注意的是第2和第3步的定义是可能会产生歧义的。现在自定义下面的bean,注意bean名字和valueSerializer和spring定义的stringRedisTemplate是不一样的

@Bean
public RedisTemplate<String, String> stringRedisTemplate_1(LettuceConnectionFactory connectionFactory) {
    RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Map.class));
    redisTemplate.setConnectionFactory(connectionFactory);
    return redisTemplate;
}

那么下面的定义是用的哪个对象呢

@Autowired
private RedisTemplate<String,String> stringRedisTemplate;

答案是spring自定的stringRedisTemplate,那么如果将上面的句柄改成stringRedisTemplate_2,结果就是会报错,因为spring无法确定,所以会抛出NoUniqueBeanDefinitionException。

也就是说想要确定我们定义的自动装载对象就是我们想要的对象时,最好是泛型和句柄都和定义bean时保持一致。文章来源地址https://www.toymoban.com/news/detail-800918.html

以上都是废话,总结一句话:实际使用中,最好使用@Qualifier注解。

到了这里,关于Springboot的redisTemplate究竟用的是哪个bean的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包