七叶笔记 » golang编程 » Spring依赖注入源码分析

Spring依赖注入源码分析

上一篇:

继上一篇源码分析,我们已经分析到spring创建完 bean 实例了,那我们这一篇来分析一下spring怎么进行依赖注入的;

一、依赖注入的名词解释

依赖注入 Dependency Injection ,简称DI,说白了就是利用反射机制为类的属性赋值的操作;

二、源码分析

我们先来看一下依赖注入的方法入口,bean创建之后再向下找一找,populateBean,翻译一下,居住在bean,可能是居住在bean的一些其他bean吧,点击进去看看;

看注释,将属性值填充给bean实例,比较可疑,再好好看看这个方法

这里的话就是获取bean的一些后处理器,这些后处理器可能是spring的,也有可能是spring初始化时第三方框架加入至spring容器的,我之前有说哈;

postProcessPropertyValues这个方法名叫什么,翻译一下,后处理属性值,不用想点进去看注释,这个方法实现类有多个,我们点击他的抽象实现看一下吧,后续小伙伴看的话可以根据自己的情况看相应的实现类;

这里会通过getBeanPostProcessors方法获取一堆的后处理器,因为一个类里面可能有许多属性值需要注入,可能是spring自己的Autowired注解需要注入的属性值,也有可能是第三方框架需要注入的属性值,如: dubbo 、或者可以加一个自己自定义的注解,将属性值通过自己需要的方式注入进去;

根据方法名称继续点击进去

这里循环一个类去做了inject(注射),那这个类是什么鬼,看一下

看一下注释,翻译为:单一注入元素,说明这个类恐怕就是代表这个类所有需要注入的元素吧,不用说,继续看

这个方法实现也有很多类,我们也去看一下他的抽象类的实现吧,后续小伙伴看的话可以根据自己的情况看相应的实现类

点击getInjectedObject(获取注入对象)继续看

看注释大概就知道这个方法是用来获取注入对象的,说明我们看的是对的。

看方法逻辑是先从缓存中获取,缓存中获取不到再去获取一个注入对象,放入缓存下次直接返回;这里的获取注入对象的方法其实是一个没有实现的抽象方法,需要子类去实现它,不同的后处理器走不同的注入对象的创建逻辑,这个是由后处理器的实现去决定的;

完成之后回到刚刚创建实例的方法那里将变量设置为可以访问的,直接将获取的注入对象利用jdk的反射机制进行赋值;

下一篇:

相关文章