beanfactory中单例bean的初始化过程(一)
Date 10.06 pm
Point
完成beanfactory中单例bean的初始化
beanFactory.preInstantiateSingletons()
拿到所有的bean定义信息(在
beanDefinitionNames中,遍历list获取到bean的定义信息
如果这个bean不是抽象,是单例,不是懒加载的
判断这个bean是否factorybean(判断这个bean有没有实现factoryBean接口),是的话,用工厂里面的方法去创建bean。
- 调用
getbean(&beanname)获取到beanFactory对象。
- 调用
调用
getBean(beanName)创建bean调用
doGetBean()transformedBeanName进入这个方法将之前工厂bean的前缀去除,将别名转成正式的名称getSingleton检测单例缓存中是否有已构建的单实例bean,有就直接返回这个单例bean/** Cache of singleton objects: bean name to bean instance. */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
```
所有实例过的单例bean都会在这注册,检查的时候还会判断当前bean有没有在创建过程中。如果有的话,会在earlySingletonObjects去获取,要是这个还是没有获取到的话,会去singletonFactories这个map中去获取,要是获取到的话就删除singletonFactories中的bean,转而在earlySingletonObjects这个map里面去注册- 没有获取到bean(开始创建bean的流程)
- 就先判断下我们是不是正在创建这个bean的实例,避免循环引用的问题。
- 获取bean的父工厂(这个主要是如果有Springmvc的话 可能会有这种父子工厂)这个父工厂要是能获取到的话,又会去调用父工厂的dogetbean方法,获取不到父工厂的话直接下一步
- 标记当前bean已经创建,大概就是把当前beanname放到
Collections.newSetFromMap(new ConcurrentHashMap<>(256))里面,防止多线程的时候多次创建单例bean - 获取bean的定义信息
- 获取bean所依赖的其他bean,如果有,还是调用getbean的方式去构建那些依赖的bean
- 如果这个bean是单例bean,回掉
createBean,开始单例bean创建- 拿到bean的定义信息
- 解析bean的定义的类型,检查这个定义信息中的beanClass是不是为空
- 检测是否有bean方法被重写,有的话准备重写这个bean方法(也是检查bean定义信息里面的
methodOverrides这个属性有没有值) - 让BeanPostProcessor提前拦截,返回代理对象
resolveBeforeInstantiation()- 先根据定义信息中的
beforeInstantiationResolved判断初始化之前有没有处理,有的话就不进入这个processor中了, - 然后判断这个值是不是由application定义的 和 判断当前factory中已经有了
InstantiationAwareBeanPostProcessor这个processor了,然后去获取这个bean的目标class,然后调用InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation启动前置处理器,然后如果返回的bean有值的话,再调用applyBeanPostProcessorsAfterInitialization后置处理器,然后将bean定义信息中beforeInstantiationResolved这个参数赋值成这个返回的bean,然后返回这个bean
- 先根据定义信息中的
beanfactory中单例bean的初始化过程(一)的更多相关文章
- Spring 源码学习 - 单例bean的实例化过程
本文作者:geek,一个聪明好学的同事 1. 简介 开发中我们常用@Commpont,@Service,@Resource等注解或者配置xml去声明一个类,使其成为spring容器中的bean,以下我 ...
- spring 中单例 bean 初始化之后和销毁之前执行指定动作 postconstruct 和 preDestroy
1 生命周期方法, 在指定bean 创建完成后执行初始化动作或销毁之前做一些善后动作.有 3 种方法 1)实现接口 InitializingBean 然后实现 afterPropertiesSet 方 ...
- Spring IOC bean加载过程
首先我们不要在学习Spring的开始产生畏难情绪.Spring没有臆想的那么高深,相反,它帮我们再项目开发中制定项目框架,简化项目开发.它的主要功能是将项目开发中繁琐的过程流程化,模式化,使用户仅在固 ...
- 【Spring源码分析】非懒加载的单例Bean初始化前后的一些操作
前言 之前两篇文章[Spring源码分析]非懒加载的单例Bean初始化过程(上篇)和[Spring源码分析]非懒加载的单例Bean初始化过程(下篇)比较详细地分析了非懒加载的单例Bean的初始化过程, ...
- Spring源码分析:非懒加载的单例Bean初始化前后的一些操作
之前两篇文章Spring源码分析:非懒加载的单例Bean初始化过程(上)和Spring源码分析:非懒加载的单例Bean初始化过程(下)比较详细地分析了非懒加载的单例Bean的初始化过程,整个流程始于A ...
- Spring源码解析之八finishBeanFactoryInitialization方法即初始化单例bean
Spring源码解析之八finishBeanFactoryInitialization方法即初始化单例bean 七千字长文深刻解读,Spirng中是如何初始化单例bean的,和面试中最常问的Sprin ...
- spring源码分析之初始化过程
1.org.springframework.web.context.ContextLoaderListener 一个ServletContextListener,web容器启动监听器 1.1内有成员C ...
- Spring IoC bean 的初始化
前言 本系列全部基于 Spring 5.2.2.BUILD-SNAPSHOT 版本.因为 Spring 整个体系太过于庞大,所以只会进行关键部分的源码解析. 本篇文章主要介绍 Spring IoC 容 ...
- 【Spring源码分析】非懒加载的单例Bean初始化过程(下篇)
doCreateBean方法 上文[Spring源码分析]非懒加载的单例Bean初始化过程(上篇),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下 ...
随机推荐
- css禁止选中文字
很简单: -moz-user-select:none;/*火狐*/ -webkit-user-select:none;/*webkit浏览器*/ -ms-user-select:none;/*IE10 ...
- Django模板语言, 过滤器整理
Django模板语言,过滤器整理 1. add {{ value|add:"2" }} 把add后的参数加给value: 处理时,过滤器首先会强制把两个值转换成Int类型. 如果强 ...
- 配置文件my.cnf---配置信息注释大全
在进行MySQL与CM+CHD之间的应用配置时,发现此前对于MySQL的配置含义过于模糊,所以将CM+CHD集群所涉及MySQL方面的配置含义进行抽取并加以注释,方便此后的配置和使用. 一.客户端设置 ...
- 阿里云服务器CentOS6.9安装SVN
1.安装SVN yum -y install subversion 出现Complete表明安装成功 2.创建SVN仓库目录 mkdir -p /data/svn/repositories/yyksv ...
- webpack原理
webpack早就已经在前端领域大放异彩,会使用和优化webpack也已经是中.高级工程师必备技能,在此基础之上再对webpack的原理进行理解和掌握,必定会在未来的开发中事半功倍.若是对于webpa ...
- uC/OS-III 时钟节拍(一)
时钟节拍就是操作系统的时基,操作系统要实现时间上的管理,必须依赖于时基(时基即时间基准,操作系统的基准时钟). uC/OS-III时钟节拍的实现过程 时钟节拍就是系统以固定的频率产生中断(时基中断), ...
- Thinkphp5.0第五篇
原样输出 使用literal标签防止模板标签被解析 例如 {literal} {$name}<br/> {/literal} 模板单行注释 {//注释内容} 多行注释 {/*注释内容*/} ...
- 写mysql语句时tab键与空格键
某网页上复制的一份mysql语句,报错,重写一遍后,好了,对比后,发现, 可以看到在sublime text中,网上复制的缩进是空白的,tab键是横杠,空格键是一个点
- C# ManualResetEvent用法
ManualResetEvent表示线程同步事件,可以对所有进行等待的线程进行统一管理(收到信号时必须手动重置该事件) 其构造函数为: public ManualResetEvent (bool in ...
- 04-04 AdaBoost算法代码(鸢尾花分类)
目录 AdaBoost算法代码(鸢尾花分类) 一.导入模块 二.导入数据 三.构造决策边界 四.训练模型 4.1 训练模型(n_e=10, l_r=0.8) 4.2 可视化 4.3 训练模型(n_es ...