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是如何被实例化出来的.先贴一下 ...
随机推荐
- 关闭vue的eslint代码检测和WebStorm的代码检测
1. 在vue项目中 bulid > webpack.base.conf.js 中: 如图,在rules规则中有一条规则是校验代码的,也就是红框2那行,要取消可以直接注释掉这行,或者把红框1的函 ...
- Android 正 N 边形圆角头像的实现
卖一下广告,欢迎大家关注我的微信公众号,扫一扫下方二维码或搜索微信号 stormjun94(徐公码字),即可关注. 目前专注于 Android 开发,主要分享 Android开发相关知识和一些相关的优 ...
- 手把手教你用最简便的方法免费安装SSL
原文链接:小枫同学的个人博客 随时IT的发展,它几乎涵盖了世界发展中的任何一方面,几乎都和计算机挂钩,也有好多小伙伴想开一个自己的网站,分享一些知识,分享一些心情等等.但是随着IT的发展,网络安全也越 ...
- spark运行信息及报错问题解决集锦
错误1: ERROR client.RemoteDriver: Failed to start SparkContext: java.lang.IllegalArgumentException: Ex ...
- Spring MVC-从零开始-@RequestMapping 注解headers 属性
package com.jt; import org.springframework.stereotype.Controller; import org.springframework.web.bin ...
- .Net Core 商城微服务项目系列(五):使用Polly处理服务错误
项目进行微服务化之后,随之而来的问题就是服务调用过程中发生错误.超时等问题的时候我们该怎么处理,比如因为网络的瞬时问题导致服务超时,这在我本人所在公司的项目里是很常见的问题,当发生请求超时问题的时候, ...
- php无限级分类实战——评论及回复功能
经常在各大论坛或新闻板块详情页面下边看到评论功能,当然不单单是直接发表评论内容那么简单,可以对别人的评论进行回复,别人又可以对你的回复再次评论或回复,如此反复,理论上可以说是没有休止,从技术角度分析很 ...
- 【原创】go语言学习(二)数据类型、变量量、常量量
目录 1.标识符.关键字2. 变量量和常量量3. 数据类型4. Go程序基本结构 标识符.关键字 1.标识符是⽤用来表示Go中的变量量名或者函数名,以字⺟母或_开头.后⾯面跟着字⺟母 ._或数字2. ...
- 项目二:企业级java电商网站开发(服务端)
声明:项目源于网络,支持正版教程,学习使用,仅记录在此 项目介绍 企业级java电商网站开发(服务端),模块划分:用户管理,商品管理,商品品类管理,订单管理,订单详情管理,购物车管理,收货地址管理,支 ...
- ef core实现软删除
很多web程序一般的偶不会设计真的物理删除了. 基本上都是在在数据库加一个标记,就得当作已经删除了.同时在查询的时候,过滤已经标记删除的数据 ef core实现软删除是非常简单的,直接在OnModel ...