Spring源码解析(二)-Spring中Bean实例化过程

@[TOC] spring Bean实例化----》 beandefinition实例化
#在上一篇文章中,我们队spring中对xml和注解的解析过程进行了详细的介绍,解析完成后都封装成对应的beandefinition对象注册到beanfactory中,接下来就是遍历beanfactory中的beandefinition对象,依次进行实例化的操作。

part1:Bean实例化过程

我们首先来到实例化的入口,上一篇文章的最后也给出了实例化的入口finishBeanFactoryInitialization:
Spring源码解析(二)-Spring中Bean实例化过程_第1张图片
跟踪到代码里面中preInstantiateSingletons,可以解决我们平时的疑惑了:懒加载,抽象类,非单例。。。。
Spring源码解析(二)-Spring中Bean实例化过程_第2张图片
接着我们进入实例化的入口getBean
Spring源码解析(二)-Spring中Bean实例化过程_第3张图片
来到doGetBean具体的实例化过程很复杂,因为我们都知道spring的实例化中有一种***循环依赖***的情况,这里先不考虑循环依赖,循环依赖,我会单独在下一篇文章讲解,这里主要讲解spring的实例化过程,所以这里就按照常规的流程往下执行,我们肯定是实例化单例的对象,所以会进入进入后面的if中
Spring源码解析(二)-Spring中Bean实例化过程_第4张图片
if里面的getSingleton中,这里就是第一次实例化单例对象的过程,可以看到这里有一个函数式编程,就是有一个回调函数在getSingleton中的ObjectFactory singletonFactory里面调用singletonFactory的getObject的方法是,会调用外面的createBean方法,我们先进入getSingleton里面
Spring源码解析(二)-Spring中Bean实例化过程_第5张图片
Spring源码解析(二)-Spring中Bean实例化过程_第6张图片
进入createbean内部,首先也是先拿到药实例化的bean的class对象

Spring源码解析(二)-Spring中Bean实例化过程_第7张图片
然后doCreateBean中执行
Spring源码解析(二)-Spring中Bean实例化过程_第8张图片
实例化createBeanInstance:
Spring源码解析(二)-Spring中Bean实例化过程_第9张图片
在createBeanInstance中我们首先看是否有FactoryMethodName属性,如果有这个属性,就执行返回对象的创建,这个FactoryMethod的属性实际上就和平时使用@Bean是一样的道理,就是代码自己new的对象,然后交给spring来管理,就是在这里实现的。我们这里不是这种方式,所以代码往后执行
Spring源码解析(二)-Spring中Bean实例化过程_第10张图片
首先是寻找当前正在实例化的bean中有@Autowired注解的构造函数(这种方式实例化对象导致的循环依赖解决不了),如果存在,就进行这种方式的实例化,但是这种方式会先实例化参数的对象,然后注入到当前bean的构造函数中实例化当前bean,实例化完成后返回实例化对象
Spring源码解析(二)-Spring中Bean实例化过程_第11张图片
如果是无参数的构造函数,就比较简单,直接根据之前封装的beandefinition对象进行实例化 ,然后返回
在这里插入图片描述
实例化完成后,
Spring源码解析(二)-Spring中Bean实例化过程_第12张图片
这个依赖注入,我们可以看到有多个实现,@Autowire(@Value使用同一个PostProcessor)和@Resource就是不同的PostProcessor
Spring源码解析(二)-Spring中Bean实例化过程_第13张图片
先进入CommonAnnotationBeanPostProcessor的postProcessMergedBeanDefinition
Spring源码解析(二)-Spring中Bean实例化过程_第14张图片
进入内部可以看到判断注解是否是@Resource注解,是的话,把注解修饰的属性封装成InjectionMetadata,然后返回metadata.checkConfigMembers(beanDefinition);把InjectionMetadata信息封装成beandefinition对象
Spring源码解析(二)-Spring中Bean实例化过程_第15张图片
@Autowire的实例和@Resource实例基本原理是一样,这里就不跟踪源码了,这个过程结束后,就完成了类中注解的装配过程,接下来就要进行依赖注入上面装配的对象
Spring源码解析(二)-Spring中Bean实例化过程_第16张图片
进入populateBean方法中,看到不同的依赖注入,实现也不一样,这里完成依赖注入后,返回
Spring源码解析(二)-Spring中Bean实例化过程_第17张图片
注入的内部实现也是会去获取属性的getbean操作(创建对象)
Spring源码解析(二)-Spring中Bean实例化过程_第18张图片
依赖注入完成后,在initializeBean可以有一些其他的操作PostConstruct等
.在这里插入图片描述
Spring源码解析(二)-Spring中Bean实例化过程_第19张图片
到这里,bean的实例化就可以说是完成了,然后返回BeanWrapper,这里返回有值,就又回到了getSingleton里面
Spring源码解析(二)-Spring中Bean实例化过程_第20张图片
来到了
Spring源码解析(二)-Spring中Bean实例化过程_第21张图片
创建完成bean后,会把bean放到一级缓存中,所以我们在开发中获取到的bean大部分是从一级缓存中获取的,到这里才是真正完成了一个bean的实例化过程
Spring源码解析(二)-Spring中Bean实例化过程_第22张图片
然后返回实例化的入口:
Spring源码解析(二)-Spring中Bean实例化过程_第23张图片
最后总结了整个实例化流程的时序图,由于图比较大,所以截图是缩小版,如果需要原版,请加关注后私信!!!
Spring源码解析(二)-Spring中Bean实例化过程_第24张图片
这篇文章是在上一篇文章spring的xml,注解解析的基础上,讲解具体的实例化过程,实际过是非常复杂的,这里只是把一些关键的执行过程进行了介绍,但是有些过程,比如循环依赖的解决,这里是没有介绍,在下篇文章将会重点介绍spring对循环依赖的解决,敬请期待!!!

你可能感兴趣的:(Spring源码解析(二)-Spring中Bean实例化过程)