@Autowired 注入 **required a single bean, but 2 were found**

原委

很简单的一个错误,今天在项目中注入StringRedisTemplate对象的时候是这样写的:redis

@Autowired
private StringRedisTemplate redisTemplate;

而后就报错了:spring

Field redisTemplate in com.xxx.api.controller.XxxController required a single bean, but 2 were found:
  - getRedisTemplate: defined by method 'getRedisTemplate' in class path resource [com/xxx/config/RedisConfig.class]
  - stringRedisTemplate: defined by method 'stringRedisTemplate' in class path resource [org/springframework/boot/autoconfigure/data/redis/RedisAutoConfiguration$RedisConfiguration.class]

一直觉得@AutoWired是要么按照类型,要么按照申明的@Qualifier("beanId")进行注入的,和我定义的redisTemplate这个field name有啥关系。。。
可是,项目其余里面都是这么写的,也没有加@Qualifier也没有报错(并且我以前用也没报错),惟一的区别就是field的name不一样,别的地方都是stringRedisTemplate,我就改了下,就真的好了。若是按照以前对@AutoWired的理解,显然这属于玄学操做。api

缘由

@Autowired 注解的注入规则:
通过一些代码的的测试,Autowired默认先按Type,若是同一个Type找到多个bean,则,又按照Name方式比对,若是还有多个,则报出异常。

按照报错提示:StringRedisTemplate这个类型的bean在容器池里面有两个redisTemplatestringRedisTemplate(咱们本身项目中配置了一个,spring boot自动配置也给我加了一个)
我定义的是field的name是redisTemplate刚好没有,而stringRedisTemplate是有的,因此没有问题!测试

解决

解决方式有不少了:ui

  1. field修改成stringRedisTemplate
  2. 使用@Qualifier指定注入bean
  3. 某些状况下,在冲突bean上加@Primary【不推荐】

END

这个我以前笔记记的都是对的,就是用它时候没有遇到过这些错误,渐渐忘了,直到遇到了才深入记住注入的流程,笔记里面有些条目觉得不重要就没认真记住,记住个大概,然而没到遇到问题前发现不了他的重要/(ㄒoㄒ)/~~。code

相关文章
相关标签/搜索