Spring 自动注入源码及解析

359 阅读1分钟

我的processon连接

先给上我processon地址:www.processon.com/view/617cea…

整体思路

spring的自动注入其实非常简单 自动注入发生在创建bean然后为bean填充属性的时候也就是熟知的populateBean方法中 在这里会调用bean的后置处理器AutowiredAnnotationBeanPostProcessor获取bean对象中所需要注入的属性,封装成一个对象,然后通过反射为bean对象进行注入

核心类和方法

AutowiredAnnotationBeanPostProcessor类的 postProcessProperties方法 postProcessProperties方法中 findAutowiringMetadata 方法用于寻找自动注入的属性并且封装成相关对象以便后续使用,inject 方法进行正式的反射调用

源码解析

主要分析上面提到的 findAutowiringMetadata 方法和 inject 方法

自动注入的起点

Snipaste_2022-03-25_22-12-55.png

Snipaste_2022-03-25_22-24-56.png

寻找需要自动注入的属性 找到 buildAutowiringMetadata 方法

1648218725040.jpg

1648218928728.jpg

开始反射进行自动注入

1648219808213.jpg

找到 resolveDependency 方法,如果自动注入那就会去Spring容器中获取自动注入的对象,那不用想肯定也会牵扯到 getBean方法,如果没有bean就再进行创建。 找到 doResolveDependency 方法内容非常多有些我自己都不太明白,很多都是在缓存中去查找相关信息, 但我知道肯定要找getBean方法

Snipaste_2022-03-25_23-10-49.png 点进去一看果然

1648221127224.jpg 这样其实就拿到对应的要注入的bean了

再到刚刚的 inject 方法 反射赋值

1648221262544.jpg

自此大差不差也算结束了

以上都是本人自行阅读源码的理解,如有不正确之处还请大佬们指正,谢谢!