本文直接讲述流程,不贴代码,全是干货,面试必看,口口相传。

熟悉Spring启动流程的同学应该清楚,refresh()是最为重要的关键方法,其调用的finishBeanFactoryInitialization(beanFactory)方法则完成了所有非懒加载的单例Bean的实例化和初始化,属性的填充以及解决了循环依赖等问题。

实例化时指将Bean创建出来,初始化是指为bean的属性赋值。

先说一下Bean的创建和管理的一个基本过程, 我们想要获取一个Bean,首先要从我们的bean工厂中获取(注意说的是ObjectFactory),bean工厂则是要去bean仓库中去取,如果仓库中有就直接返回,没有则会创建然后再返回。

SingletonBeanRegistry的实现DefaultSingletonBeanRegistry的属性中便保存着我们的单例对象(三级缓存便在其中)。

代码中创建Bean的过程分为了三步:实例化、填充属性、初始化,分别对应方法createBeanInstance、populateBean和 initializeBean;

之所以和我们前面提过的初始化即是属性赋值有所不同,是因为spring在填充完属性后又执行了一些这个Bean相关的初始化方法。

明白了大致过程后,接下来直接过获取Bean流程:

  • getBean方法在Bean的创建和获取过程中都会用到;另外,我们要注意spring方法起名的特点,有getBean方法,又会有doGetBean方法。同理,后面调用createBean方法,也会调用到doCreateBean方法。
  • getBean后会调用doGetBean方法,第一次调用getSingleton方法先从单例池(一级缓存)中获取;然后当前Bean如果有配置了 depend-on 标签的话,会先去初始化配置的Bean;
  • 紧接着判断是否单例,会第二次调用getSingleton方法,和第一次方法传参不同,多了一个ObjectFactory参数,ObjectFactory是一个函数式接口,有一个抽象方法getObject,而getSingleton的传参是以lamda表达式(即内部实现类)来写的,也就是说,内部类中return的creatBean方法的结果就是ObjectFactory的getObject()返回的值,也就是我们的bean工厂,生成后会保存在一个名叫singleObjects的Map(一级缓存)当中。
  • creatBean调用doCreatBean,接着调用createBeanInstance实例化Bean,主要是为了推断出实例化Bean所需要的构造器,通过反射创建对象;
  • 然后会缓存一些注解元数据信息以及addSingletonFactory方法解决循环依赖问题,此处代码不做重点讲述,面试会直接问循环依赖问题的。
  • 接着执行populateBean方法填充属性,执行两个后置处理器完成自动装配的功能。
  • 接下来会执行initializeBean()方法,该方法中主要会判断执行Aware接口的方法,以及后置处理器的初始化前和初始化后方法等。

好了,虽然以上内容讲解不够详细,但应付面试绰绰有余,想更加详细的理解还是要自己搭建spring本地部署运行起来,一步步地debug,自己加注释,才容易融会贯通。

简单理解Spring getBean流程相关推荐

  1. Spring getBean流程

    Bean的生命周期(创建Bean的流程) 简单来说,Bean的生命周期只有四个阶段:实例化 Instantiation --> 属性赋值 Populate --> 初始化 Initiali ...

  2. 简单理解Spring中的PROPAGATION_NESTED

    http://sharajava.iteye.com/blog/78270

  3. Spring IoC 源码系列(五)getBean 流程分析

    一.FactoryBean 用法讲解 在分析源码流程之前,我们先来看一下 FactoryBean,乍一看这家伙和 BeanFactory 很像,它们都可以用来获取 bean 对象,简单来说 Facto ...

  4. Spring Security并没有那么难嗷 简单理解OAuth2.0

    文章目录 1. 基本概念 1.1 什么是认证 1.2 什么是会话 1.3 什么是授权 1.4 授权的数据模型 1.5 RBAC 1.5.1 基于角色的访问控制 1.5.2 基于资源的访问控制 2. 基 ...

  5. 简单的spring项目搭建流程

    一.搭建步骤 创建空maven项目 pom文件导入相应依赖jar包 创建包结构(domain.test即可) 创建JavaBean配置文件 编写简单示例 二.开始 1.创建一个空的maven项目  2 ...

  6. 互相引用 spring_巧夺天工,这样理解Spring的IOC、DI下来,真的很清晰了

    前言 你可能会有如下问题: 想看Spring源码,但是不知道应当如何入手去看,对整个Bean的流程没有概念,碰到相关问题也没有头绪如何下手 看过几遍源码,没办法彻底理解,没什么感觉,没过一阵子又忘了本 ...

  7. 深入理解Spring两大特性:IoC和AOP

    Spring Boot 专栏:https://blog.csdn.net/dkbnull/category_9278145.html Spring Cloud 专栏:https://blog.csdn ...

  8. getBean( )流程

    getBean() 方法是顶层接口 BeanFactory 提供的,一共五个原型.AbstractBeanFactory作为抽象实现,复写了其中3个方法, @Overridepublic Object ...

  9. 【简单易懂】getBean(id)和getBean(Class)使用的区别

    首先看一下最基本的Bean的结构 <bean id="1234" class="User">... </bean> 其中,若执行xxx. ...

最新文章

  1. 共话数据智能新经济,首届市北·GMIS 2019全球数据智能峰会隆重召开
  2. R语言ggplot2可视化移除轴标签、图例、主体等所有附属信息实战
  3. iOS 字符属性NSAttributedString描述
  4. WRF,WPS,WRF-Chem安装及编译步骤及bug总结(2)
  5. 系统测试集成测试单元测试_单元和集成测试的代码覆盖率
  6. linux串口缓冲区的大小,linux-----------串口设置缓冲器的大小
  7. Java笔记之对象代理实例
  8. C#调用系统的复制、移动、删除文件对话框
  9. Docker使用小结(四)发布镜像
  10. hdu 5178 pairs (线性探查问题)
  11. 深度学习之四大经典CNN技术浅析
  12. undo log、rollback segment
  13. 大白菜u启动盘安装linux,大白菜U盘启动pe装系统教程
  14. 2017满分题库完整版超星尔雅俄国近代思想史章节测试考试答案
  15. 2021美团Java面试真题解析(含参考答案)
  16. ElasticSearch head 安装
  17. 世界银行公布各国1996-2018年GDP及GDP增长率
  18. 视频监控远程传输方案
  19. 正确的选择大于努力_选择正确技术的11个注意事项
  20. 我的Redis哨兵为什么不切换?

热门文章

  1. 高清录播服务器(什么是服务器)
  2. 手机关闭java 功能吗,赶紧关闭手机这功能,不然你将后悔莫及
  3. 河北外国语学院计算机学院汤智,重磅!河北外国语学院国际语言教育学院13名考研英雄凯旋!...
  4. python-opencv 将连续图片保存为视频格式
  5. iOS-FLAnimatedImage加载Gif
  6. MFC应用SkinMagic皮肤可视化包更换程序外观皮肤
  7. 八皇后 C++ 递归算法和循环嵌套算法 共得到 92 种题解
  8. springboot断点调试
  9. 华为HCIE云计算之ebackup备份FC虚拟机
  10. HyperLandmark-开源人脸106点关键点检测SDK,北京智云视图科技