Spring源码分析(2)-DI 依赖注入过程分析
DI 注入时序图
整个注入过程可以分成 2 个阶段
实例化:创建对应的 bean
依赖注入:将 bean 的相关依赖注入到实例中
入口分析
如果没有设置 lazy-init=false,那么 spring 默认会在第一次调用 bean 的时候才初始化 bean,所以入口在 beanFatcory 接口的 getBean 方法中。
如果设置了 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 注入相关属性。