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