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

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

part1:Bean实例化过程

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

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

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值