简单理解Spring getBean流程
本文直接讲述流程,不贴代码,全是干货,面试必看,口口相传。
熟悉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流程相关推荐
- Spring getBean流程
Bean的生命周期(创建Bean的流程) 简单来说,Bean的生命周期只有四个阶段:实例化 Instantiation --> 属性赋值 Populate --> 初始化 Initiali ...
- 简单理解Spring中的PROPAGATION_NESTED
http://sharajava.iteye.com/blog/78270
- Spring IoC 源码系列(五)getBean 流程分析
一.FactoryBean 用法讲解 在分析源码流程之前,我们先来看一下 FactoryBean,乍一看这家伙和 BeanFactory 很像,它们都可以用来获取 bean 对象,简单来说 Facto ...
- Spring Security并没有那么难嗷 简单理解OAuth2.0
文章目录 1. 基本概念 1.1 什么是认证 1.2 什么是会话 1.3 什么是授权 1.4 授权的数据模型 1.5 RBAC 1.5.1 基于角色的访问控制 1.5.2 基于资源的访问控制 2. 基 ...
- 简单的spring项目搭建流程
一.搭建步骤 创建空maven项目 pom文件导入相应依赖jar包 创建包结构(domain.test即可) 创建JavaBean配置文件 编写简单示例 二.开始 1.创建一个空的maven项目 2 ...
- 互相引用 spring_巧夺天工,这样理解Spring的IOC、DI下来,真的很清晰了
前言 你可能会有如下问题: 想看Spring源码,但是不知道应当如何入手去看,对整个Bean的流程没有概念,碰到相关问题也没有头绪如何下手 看过几遍源码,没办法彻底理解,没什么感觉,没过一阵子又忘了本 ...
- 深入理解Spring两大特性:IoC和AOP
Spring Boot 专栏:https://blog.csdn.net/dkbnull/category_9278145.html Spring Cloud 专栏:https://blog.csdn ...
- getBean( )流程
getBean() 方法是顶层接口 BeanFactory 提供的,一共五个原型.AbstractBeanFactory作为抽象实现,复写了其中3个方法, @Overridepublic Object ...
- 【简单易懂】getBean(id)和getBean(Class)使用的区别
首先看一下最基本的Bean的结构 <bean id="1234" class="User">... </bean> 其中,若执行xxx. ...
最新文章
- 共话数据智能新经济,首届市北·GMIS 2019全球数据智能峰会隆重召开
- R语言ggplot2可视化移除轴标签、图例、主体等所有附属信息实战
- iOS 字符属性NSAttributedString描述
- WRF,WPS,WRF-Chem安装及编译步骤及bug总结(2)
- 系统测试集成测试单元测试_单元和集成测试的代码覆盖率
- linux串口缓冲区的大小,linux-----------串口设置缓冲器的大小
- Java笔记之对象代理实例
- C#调用系统的复制、移动、删除文件对话框
- Docker使用小结(四)发布镜像
- hdu 5178 pairs (线性探查问题)
- 深度学习之四大经典CNN技术浅析
- undo log、rollback segment
- 大白菜u启动盘安装linux,大白菜U盘启动pe装系统教程
- 2017满分题库完整版超星尔雅俄国近代思想史章节测试考试答案
- 2021美团Java面试真题解析(含参考答案)
- ElasticSearch head 安装
- 世界银行公布各国1996-2018年GDP及GDP增长率
- 视频监控远程传输方案
- 正确的选择大于努力_选择正确技术的11个注意事项
- 我的Redis哨兵为什么不切换?
热门文章
- 高清录播服务器(什么是服务器)
- 手机关闭java 功能吗,赶紧关闭手机这功能,不然你将后悔莫及
- 河北外国语学院计算机学院汤智,重磅!河北外国语学院国际语言教育学院13名考研英雄凯旋!...
- python-opencv 将连续图片保存为视频格式
- iOS-FLAnimatedImage加载Gif
- MFC应用SkinMagic皮肤可视化包更换程序外观皮肤
- 八皇后 C++ 递归算法和循环嵌套算法 共得到 92 种题解
- springboot断点调试
- 华为HCIE云计算之ebackup备份FC虚拟机
- HyperLandmark-开源人脸106点关键点检测SDK,北京智云视图科技