代码如下:
@RunWith(SpringRunner.class)
@SpringBootTest
class RedisdemoApplicationTests {
@Autowired
private RedisTemplate template;
@Test
public void a() {
template.opsForValue().set("1","测试中文");
System.out.println(template.opsForValue().get("1"));
}
}
错误信息
Could not autowire. There is more than one bean of 'RedisTemplate' type.
Beans:
redisTemplate (RedisAutoConfiguration.class) stringRedisTemplate (RedisAutoConfiguration.class)
错误原因
StringRedisTemplate 类是RedisTemplate 的子类,子类注入时会调用父类。事实上我们可以理解为子类也是一种特殊的父类。
对于@Autowired注解,它是先根据类型注入,由于存在两个RedisTemplate 类型,它不知道应该注入哪一个。然后根据名称注入,由于该对象名称为template,无法断定类型,所以报错。
解决方案
- 1.将对象名改为redisTemplate使用@Autowired注解:@Autowired在根据类型无法判断时会根据名称进行注入。
- 2.将对象名改为redisTemplate使用@Resource注解:@Resource会根据名称进行注入。
- 3.不改对象名,使用@Resource(name = “redisTemplate”)指定名称注入。