spring5源码解读2springBean的实例化和注入(DI)

编程

上一篇文章已经解读了spring Bean 定义规范的封装BeanDefinition:https://my.oschina.net/huangguangsheng/blog/3273910

首先回到 AbstractApplicationContext 的refresh()方法,前面已经解析xml或者注解的类封装成BeanDefinition并注册到BeanFactory里面。

该章节主要讲的是:

1  Bean单例的实例化,(spring 单例能解决循环依赖的问题,其他方式直接报错)

2  它的相关属性的注入(引用类型一定会出发getBean()实例化操作),看源码一定要先关注主流程。

第 1 步 先回到原点,完成两个关键接口的调用:BeanDefinitionRegistryPostProcessor, BeanFactoryPostProcessor

第 2 步 进入invokeBeanFactoryPostProcessors,并实例化所有的BeanFactoryPostProcessors处理器

第 3 步 BeanPostProcessor的注册

第 4 步 进入registerBeanPostProcessors的方法体中,实现逻辑跟前面的 BeanDefinitionRegistryPostProcessor 类似

第 5 步 先忽略refresh() 中间的其他方法,直接看最重要的一个实例化方法 finishBeanFactoryInitialization()

第 6 步 进入到类AbstractApplicationContext.java的 finishBeanFactoryInitialization(beanFactory)方法体中

第  7 步 继续围绕我们开头的那个Student的实例化进行,进入DefaultListableBeanFactory.java 的perInstantiateSingletons()的方法中

第  8 步 跳转到AbstractBeanFactory.java 的getBean()-->doGetBean()

doGetBean方法也是实例化的重要方法,循环依赖问题,实例化,注入都是在这里做的

但是这里我只关注bean的实例化以及注入的主流程,循环依赖下一章节会写。

第  9 步 由创建单例的内部类体跳转到 AbstractAutowrieCapableBeanFactory.java的 createBean()方法中

第  10 步 进到doCreateBean()方法体

第  11 步 我们继续关注我们实例化Bean 的方法在第10步 instanceWrapper = createBeanInstance(beanName, mbd, args); 方法

第  12 步 进入instantiateBean()方法

第  13 步 进入instantiate()方法,反射创建,cglib代理创建

第  14 步 第13步实例化Student 对象之后,就返回 第10步,继续下面判断有没有注入 的代码块的populateBean()方法,

你想想我们注入的是一个class (引用)类型的属性,所以肯定会去getBean()实例化 Course 的操作,顺着这个思想往下看

 

第  15 步 进入到  PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName); 方法体

 

第  16 步 进入属性的处理类的 inject()方法,然后进入resolvedCachedArgument()方法

第  17 步 进入resolvedCachedArgument()的 DefaultListableBeanFactory.java 中的 doResolveDependency()方法

然后调用  instanceCandidate = descriptor.resolveCandidate(autowiredBeanName, type, this); 创建实例

第  18 步 触发getBean()创建实例方法,然后返回到16步的 inject()方法进行属性的注入

 

第  19 步注入完成,整个spring IOC 创建Student实例然后往实例里注入Course就完成了

以上是 spring5源码解读2springBean的实例化和注入(DI) 的全部内容, 来源链接: utcz.com/z/515874.html

回到顶部