spring @Autowired注解(在不配合@Qualifier使用的情况下),并不仅仅按照byType进行注入,在有些情况下会使用byName策略

今天因为要用到消息队列,所然后项目中没有搭建专门的分布式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是不同的实例了。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值