混用StringRedisTemplate和RedisTemplate,同时使用@Autowired和@Resource。导致序列化不一致问题

简单记录下重构项目遇到的坑。解决问题办法万万种,但千万别不懂乱搞。

问题描述: 数据存入redis后,反序列化操作时报错。业务层引用其他业务层,此时其他业务层通过@Autowired注入了【RedisTemplate】,将数据存入redis。但是查询业务时,最先注入的是【StringRedisTemplate】。导致反序列化失败。

一、@Autowired和@Resource区别
@Resource装配顺序
  1. 如果同时指定name和type,则从Spring上下文中找到唯一匹配的bean进行装配
  2. 如果只指定name,则从上下文中查找名称(id)匹配的bean进行装配
  3. 如果只指定type,则从上下文中找到类型匹配的唯一bean进行装配
  4. 如果既没有指定name,又没有指定type,则自动按照byName(字段名字作为bean id)方式进行装配。如果没有匹配,则类型进行匹配
@Autowired装配顺序
  1、默认先按类型匹配
  2、如果发现找到多个bean(子类或者实现类很多,一般都是抽象类和接口),则又按照字段Name方式比对,如果还有多个,则报出异常

二、总结:
1、使用@Autowired首先通过类型匹配,而RedisTemplate是StringRedisTemplate父级也就是同源。如果只注入了StringRedisTemplate或
RedisTemplate时,会导致byType找到的不一定是当前引用的Template,此时如果序列化不是当前Template格式就会报错
2、使用@Resource首先通过byName,而项目使用时指定name。所以只注入其中一个时,如果name相同没有问题,如果name不同则通过byType注入。
此时必然不一致。

三、建议:
1、项目只是用一种Template(推荐)
2、使用两种时使用@Resource注解,且通过name注入

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值