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是如何被实例化出来的.先贴一下 ...
随机推荐
- JavaScript自动播放背景音乐
问题描述 js控制audio自动播放音乐时报错: Uncaught (in promise) DOMException 我的报错之前的代码: <audio id="myaudio&qu ...
- 讨厌的Permission denied:adb访问手机目录时,怎么处理Permission denied问题
故事背景 手机某app出现了无响应,我想找到手机anr日志 但我只知道在data目录的某个目录里有个tra**的文件里有anr日志 具体的我真忘了,所以想要进入data中用ls查看一下 结果就出现了讨 ...
- jenkins构建项目时报错缺少com.sun.image.codec.jpeg包解决方案
错误日志:error: package com.sun.image.codec.jpeg does not exist 网上找的一个项目,使用的是jdk1.7,除此之外其他服务器配置或是环境配置都是j ...
- 【SQL server基础】SQL视图加密,永久隐藏视图定义的文本
SQL可以对视图进行加密.也就是,可永久隐藏视图定义的文本. 注意 此操作不可逆.加密视图后,无法再修改它,因为无法再看到视图定义.如果需要修改加密视图,则必须删除它并重新创建另一个视图. 示例代 ...
- 认识MongoDB复制集
从这一篇开始,我们要踏上MongoDB进阶之路啦,想想还有点小开心呢.一筐猪镇楼. 引入复制集 我们先来想一个场景,如果本地项目使用MongoDB,都是下载,安装,连接一条龙服务.这实际也就是 ...
- .Net Core自动化部署系列(一):Jenkins + GitLab
项目进行微服化改造后系统发布就变得愈为重要,因为持续集成导致部署变得越来越频繁,人工部署带来的一些问题日渐凸显,大家可能都有被系统部署线问题困扰过的经历. 本篇我们将会使用Jenkins+Gitlab ...
- VR中的“寻路(wayfinding)”
虚拟现实(VR)中很重要的一个问题就是Locomotion(用户在VR中的移动).这个Locomotion分为两种,一种是点对点的,如传送门的方式,一种是包含了可以操控的中间过程的,这种被称为“导航( ...
- 前端深入之css篇|link和@import到底有什么区别?
写在前面 在真正的前端开发中,我们很少去写行内样式和内嵌样式,通常都是去引用外部样式. 而在我们学习之初的外部样式表都是用link引入的,但是当后来我们学习的逐渐深入,发现@import也可以引入样式 ...
- Cocos Creator 3D 打砖块图文教程(一)
在线体验链接: http://example.creator-star.cn/block3d/ 上面图中是打砖块游戏的主要 3D 节点元素,Shawn 这两天在学习 Unity 与 Creator3D ...
- texlive支持中文的简单方法
1.确保tex文件的编码方式是UTF-8, 2.在文档开始处添加一行命令即可,即 \usepackage[UTF8]{ctex} , 如下所示: \documentclass{article} \us ...