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是如何被实例化出来的.先贴一下 ...
随机推荐
- MySQL中常用到的关于时间的SQL
-- 今天 SELECT DATE_FORMAT(NOW(),'%Y-%m-%d 00:00:00') AS dayStart;SELECT DATE_FORMAT(NOW(),'%Y-%m-%d 2 ...
- 夯实Java基础系列4:一文了解final关键字的特性、使用方法,以及实现原理
目录 final使用 final变量 final修饰基本数据类型变量和引用 final类 final关键字的知识点 final关键字的最佳实践 final的用法 关于空白final final内存分配 ...
- 品Spring:实现bean定义时采用的“先进生产力”
前景回顾 当我们把写好的业务代码交给Spring之后,Spring都会做些什么呢? 仔细想象一下,再稍微抽象一下,Spring所做的几乎全部都是: “bean的实例化,bean的依赖装配,bean的初 ...
- CDH集群的配置优化须知
通过改善IFile阅读器的性能 IFile Reader,进而可改善随机处理程序并减少储备空间,达到MapReduce的配置最佳实践要求.而MapReduce shuffle的处理程序和 ...
- eclipse与hadoop集成,运行wordCount1
搭好了hadoop集群之后,就该使用它了 第一步:下载hadoop eclipse的插件,将它放到eclipse\plugins的目录下,然后重启eclipse,点击windows->show ...
- ELK 学习笔记之 Logstash基本语法
Logstash基本语法: 处理输入的input 处理过滤的filter 处理输出的output 区域 数据类型 条件判断 字段引用 区域: Logstash中,是用{}来定义区域 区域内,可以定义插 ...
- Flume 学习笔记之 Flume NG+Kafka整合
Flume NG集群+Kafka集群整合: 修改Flume配置文件(flume-kafka-server.conf),让Sink连上Kafka hadoop1: #set Agent name a1. ...
- [ASP.NET Core 3框架揭秘] 依赖注入:控制反转
ASP.NET Core框架建立在一些核心的基础框架之上,这些基础框架包括依赖注入.文件系统.配置选项和诊断日志等.这些框架不仅仅是支撑ASP.NET Core框架的基础,我们在进行应用开发的时候同样 ...
- ASRWGAN: Wasserstein Generative Adversarial Network for Audio Super Resolution
ASEGAN:WGAN音频超分辨率 这篇文章并不具有权威性,因为没有发表,说不定是外国的某个大学的毕业设计,或者课程结束后的作业.或者实验报告. CS230: Deep Learning, Sprin ...
- mvvm的初步思想
1.Object.defineProperty(obj,key,desc); 用法:1.给对象新增属性和特性 2.修改对象属性值和特性 desc(属性特性): 1.enumerable:boolean ...