DI 注入时序图

整个注入过程可以分成 2 个阶段

  1. 实例化:创建对应的 bean

  2. 依赖注入:将 bean 的相关依赖注入到实例中

image-20200903172942096

入口分析

  1. 如果没有设置 lazy-init=false,那么 spring 默认会在第一次调用 bean 的时候才初始化 bean,所以入口在 beanFatcory 接口的 getBean 方法中。

  2. 如果设置了 lazy-init=false,那么 spring 会在容器启动的时候直接初始化。在上一篇分析 IOC 初始化的时候,容器在初始化的时候都会调用 refresh 方法,在 refresh 方法中有一个 finishBeanFactoryInitialization 方法,这个就是直接初始化 bean 的入口,而在 finishBeanFactoryInitialization 方法内部其实也是调用 BeanFactory 的 getBean 方法来生成 bean 的

源码分析

调用 BeanFatory 的 getBean 方法->AbstractBeanFactory 的 getBean 方法的具体实现->调用 AbstractAutowireCapableBeanFactory 的 createBean 方法->AbstractAutowireCapableBeanFactory 的 doCreateBean 方法->先执行 createBeanInstance 创建对应的实例,然后通过 populateBean 注入相关属性。调用 BeanFatory 的 getBean 方法->AbstractBeanFactory 的 getBean 方法的具体实现->调用 AbstractAutowireCapableBeanFactory 的 createBean 方法->AbstractAutowireCapableBeanFactory 的 doCreateBean 方法->先执行 createBeanInstance 创建对应的实例,然后通过 populateBean 注入相关属性。