【Spring源码】Autowired注入流程

本文详细介绍了Spring框架中@Autowired注解的工作原理,从环境配置到源码分析,揭示了注解如何实现属性注入,特别是在遇到多个相同bean实例时的处理策略。文章通过时序图和源码解析,带领读者逐步理解Spring容器的初始化过程和依赖解析机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hello!各位小伙伴们,好久不见!距我上一篇文章已经过了7个多月了。以后尽可能的加快更新的进度,下面让我来带大家感受Spring中的Autowired注解的设计之美吧!

1637755884964.jpg

一、环境

本源码是基于jdk1.8、spring5.2.8.RELEASE的环境【特别注意:不同的源码下,源码可能存在差异

二、时序图

话说,当你使用Spring框架进行开发的时候,会不会存在这样的疑问:“为什么加上一个Autowired注解,就可以实现属性注入?它是怎么做到的?如果Spring容器中存在多个相同的bean实例,会怎么样?它是如何判断该属性或方法上是否加上了Autowired注解的?” 相信你时常存在这样的疑问!
sure,我同样存在这些疑问。于是花了一周的时间特地研究了一下Spring的底层源码,当然,一篇文章肯定无法解答你所有的疑惑。这里先进行全流程的分析,也希望你能对照着本篇文章,去看看底层源码【图片看不清的话,点击下载

是不是看到了这张图之后,就立马想放弃了?别慌!暖心的我会带你慢慢的讲解一遍的。是不是有点小感动呢?可不要爱上我哦!

15833810244644.jpg

三、源码分析

用了这么久的微服务进行开发,还记得启动类里面的代码吗?

carbon (1).png
点进去后,会来到SpringApplication中的run方法,run方法中会调用refreshContext方法,刷新上下文容器。没错就是它!【在refreshContext里面会调用refresh方法,进行刷新操作

carbon (3).png
接下来就会来到AbstractApplicationContext中的refresh方法,它很重要!很重要!很重要! 也是本文需要重点关注的方法,里面的细节贼多

carbon (4).png
由于Spring中的bean默认是非懒加载初始化的,当我们向自定义的bean进行属性或方法注入时,是由finishBeanFactoryInitialization方法帮我们完成的。我们只需要关注这个方法中的beanFactory.preInstantiateSingletons方法,非懒加载的bean实例化工作是由这个方法帮我们完成的

carbon (6).png
carbon (7).png
由于我们自定义的bean大多不会实现BeanFactory接口,大多数情况下会进入if代码块中,直接调用getBean方法

carbon (8).png
由于Spring中默认的就是单例模式,因此,针对上面的代码,我们只需要关注getSingleton方法,在getSingleton方法中,会调用AbstractAutowireCapableBeanFactory的createBean方法

carbon (9).png
这个方法中applyMergedBeanDefinitionPostProcessors会处理@Autowired、@Value、@PostConstruct、@PreDestroy、@Inject等注解这些注解,可以看到多个实现类,只看处理@Autowired注解的实现类AutowiredAnnotationBeanPostProcessor

carbon (10).png
当我们获取到对应的元数据信息后,下一步就是需要进行属性注入操作了。在面试的时候,面试官是否问过你,Autowired注解默认根据Type查找依赖的bean,如果找到多个如何处理?

carbon (11).png
此处省略N步,直接看AutowiredAnnotationBeanPostProcessor的内部类InjectedElement,这个内部类中的beanFactory.resolveDependency就会处理多个依赖的问题

carbon (12).png
最终会调用DefaultListableBeanFactory的doResolveDependency方法。最后就是采用反射的方式,进行属性注入

carbon (14).png

四、总结

在日常开发中,我们常常会使用Autowired注解,却很少去深入源码。相信这篇文章能或多或少的能帮助到你,其实写这篇文章,我花了整整一周的时间看源码,那痛苦,你懂我吧。以上只是简单的梳理一下整个类之间的调用流程,针对里面的一些细节部分,后续会继续深入补充、完善的。

doutub_img.png

好了,能看到这里的都是大佬啊!如果感觉文章还不错的话,请给我点小小的鼓励, 点赞、收藏+转发 !如果有什么好的意见或建议,也请给我留个言或私信我!谢谢各位看官!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值