很简单的一个错误,今天在项目中注入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在容器池里面有两个redisTemplate,stringRedisTemplate(咱们本身项目中配置了一个,spring boot自动配置也给我加了一个)
我定义的是field的name是redisTemplate刚好没有,而stringRedisTemplate是有的,因此没有问题!测试
解决方式有不少了:ui
这个我以前笔记记的都是对的,就是用它时候没有遇到过这些错误,渐渐忘了,直到遇到了才深入记住注入的流程,笔记里面有些条目觉得不重要就没认真记住,记住个大概,然而没到遇到问题前发现不了他的重要/(ㄒoㄒ)/~~。code