简单记录下重构项目遇到的坑。解决问题办法万万种,但千万别不懂乱搞。
问题描述: 数据存入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注入