今天因为要用到消息队列,所然后项目中没有搭建专门的分布式MQ,但有redis,所以我就去看了下项目里的redis配置信息。。然后就看见了神奇的一件事(以前一直以为这是错误的)。
先看spring的配置文件,配置了下面两个bean。
其实就是序列化方式不一样,一个jdk的方式,一个json。
注意id,额,我指的是两个bean的id不同,第二个命名用two这个请不要吐槽,因为这也不是我写的。。
记住,id命名不同这和后面要讲的是相关的。
然后怎么注入的呢?还是分别两张截图:
到这里不知道你们有没有发现问题。。或者说你们已经懂了(只有我不懂?)。
不管怎样,我还是要说一说的。。
上面两个注入语句都是只用了@Autowired,没有用@Qualifier。
按照我以前的理解(半错误的理解):只用了@Autowired铁定是byType啊,并且当spring容器中存在两个相同类型的bean是,使用@Autowired肯定会报错的。除非设置require=false。
但是我们项目的项目像上面那样配置使用完全没有问题。。两个redisTemplate都注入成功,正常使用。并且,注入的也是两个不同的bean。。所以就感觉知识受到了挑战。
各种百度,但是几乎都是说使用@Autowired和@Qualifier指定beanName 或者直接用@Resource指定beanName。。
根本就不是我的解答,我也怀疑@Autowired是不是byType失败时还会使用byName。。
但我木有证据,去查看源码要到猴年马月(虽然我跟着《Spring源码深度解析》这本书看过一半的源码,但我看@Autowired注入这块的时候是快速略过的,根本没注意到@Autowired在byType根据类型查找bean失败时还会使用byName根据字段名称查找bean)。
然后根据这个怀疑的问题去百度上搜,额,大多数还是@Autowired和@Qualifier,但还是找到了相关文章,看了这篇文章真是一语惊醒梦中人啊,跟着上面的步骤做了一遍,果然如此:
@Autowired在byType根据类型查找bean失败时还会使用byName根据字段名称查找bean
文章链接:https://blog.csdn.net/yangjiachang1203/article/details/52128830
这时候再看:
就能明白为什么这两个字段注入的bean是不同的实例了。