源码:Spring常规Bean创建过程

article/2025/8/13 15:36:44

Bean创建过程:

一、版本

5.3.10

二、学习内容

Bean创建过程源码

三、Bean生命周期

时间轴地址:点击

在这里插入图片描述

四、bean创建过程脑图总结

脑图地址:点击
在这里插入图片描述

五、源码过程

说明:
bean创建入口一般都是通过getBean(xxx);方法进入的,进入后就会调用doGetBean方法,
咱们就直接从AbstractBeanFactory类的doGetBean开始
doGetBean()
//1、执行getSingleton(beanName);从单例池里获取该bean,咱们新建肯定没有,直接往下
getSingleton(beanName);
//2、判断如果是单例直接执行(备注:本文只讲常规单例bean创建):getSingleton(beanName, () -> {try {return createBean(beanName, mbd, args);}catch (BeansException ex) {// Explicitly remove instance from	 singleton cache: It might have been put there// eagerly by the creation process, to allow for circular reference resolution.// Also remove any beans that received a temporary reference to the bean.destroySingleton(beanName);throw ex;}});
getSingleton(String beanName,ObjectFactory<?> singletonFactory)方法:
//1、创建当前bean的BeanCurrentlyInCreationException对象;
beforeSingletonCreation(beanName); 
//2、实际创建,这里是用函数式(@FunctionalInterface)接口ObjectFactory<T>写的 
//.getObject() == createBean(); 【createBean()方法比较关键,后面细说】
singletonFactory.getObject();
//3、this.singletonsCurrentlyInCreation.remove(beanName)
afterSingletonCreation(beanName);
//4、将创建的单例bean放入单例池中:
//this.singletonObjects.put(beanName, singletonObject);
//this.singletonFactories.remove(beanName);	
//this.earlySingletonObjects.remove(beanName);			
//this.registeredSingletons.add(beanName);
addSingleton(beanName, singletonObject);
//5、创建完成返回Bean; 下面的内容主要是补充剖析第二点。
createBean()方法:
//1、实例化前执行:这里主要执行所有实现了InstantiationAwareBeanPostProcessor的处理器,
//执行方法为:postProcessBeforeInstantiation();如果执行了上面方法获得了对象还会执行:
//postProcessAfterInitialization();方法最终返回bean对象。
resolveBeforeInstantiation(beanName, mbdToUse); 
//2、重点方法,详解在下面:
//1)、执行创建
//2)、属性注入
//3)、初始化 等
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
doCreateBean()方法
//1、创建bean实例,这里边会有有一个获取构造方法的逻辑,这里就不多讲了,默认取无参构造。
createBeanInstance(beanName, mbd, args);
//2、实例化后执行BeanPostProcessor:
//执行所有MergedBeanDefinitionPostProcessor 类型beanPostProcessor的postProcessMergedBeanDefinition方法();
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
//3、将bean实例存入三级缓存中,这里对循环依赖有所有帮助的。
//一级缓存:singletonObjects
//二级缓存:earlySingletonObjects
//三级缓存:singletonFactories
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
//4、属性填充:主要依赖于bean后置处理器来完成
//4.1、属性填充执行BeanPostProcessor处理1:
//执行所有InstantiationAwareBeanPostProcessor类型的bean处理器postProcessAfterInstantiation()方法
//4.2、属性填充执行BeanPostProcessor处理2:
//执行所有InstantiationAwareBeanPostProcessor类型的bean处理器postProcessProperties()方法,
//这里有非常重要的处理AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor 处理器,会执行依赖注入功能。
populateBean(beanName, mbd, instanceWrapper);
//5、初始化
initializeBean(beanName, exposedObject, mbd);
//5.1、执行Aware(部分)接口实现的功能:
//BeanNameAware
//BeanClassLoaderAware
//BeanFactoryAware
invokeAwareMethods(beanName, bean);
//5.2、初始化前BeanPostProcessor​处理:
//获取所有实现BeanPostProcessor的处理器
//执行postProcessBeforeInitialization()方法
//特殊说明:这里有个ApplicationContextAwareProcessor处理器,主要处理部分Aware接口实现类的功能:
//EnvironmentAware
//EmbeddedValueResolverAware
//ResourceLoaderAware
//MessageSourceAware
//ApplicationStartupAware
//ApplicationEventPublisherAware
//ApplicationContextAware
applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
//5.3、初始化:
//1)、执行实现了InitializingBean类的afterPropertiesSet()方法初始化
//2)、执行init-method方法初始化
invokeInitMethods(beanName, wrappedBean, mbd);
//5.4、初始化后执行处理器:
//执行所有实现BeanPostProcessor的处理器postProcessAfterInitialization()方法;
applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);

http://www.hkcw.cn/article/qrGqJGojsd.shtml

相关文章

用ENSP完成SSH登录实验(设备间登录),学起来学起来!!

最近才用到SSH的登录功能&#xff0c;简单的学习总结。大佬勿喷&#xff01;&#xff01;&#xff01; 用ENSP完成SSH登录实验&#xff08;设备间相互登录&#xff09;&#xff0c;学起来学起来&#xff01;&#xff01; 具体思路&#xff1a; 设备连线&#xff0c;启动。配…

调整图片和表格尺寸的命令:resizebox

\resizebox 是 LaTeX 中的一个命令&#xff0c;用于调整插入的内容&#xff08;如图像、表格、文本等&#xff09;的大小。它的语法如下&#xff1a; \resizebox{<width>}{<height>}{<content>}其中&#xff1a; <width> 和 <height> 分别表示…

Linux练级宝典->动态库和静态库

动静态库的原理 我们知道可执行文件前的4步骤 预编译->编译->汇编->链接 预处理&#xff1a; 完成头文件展开、去注释、宏替换、条件编译等&#xff0c;最终形成xxx.i文件。编译&#xff1a; 完成词法分析、语法分析、语义分析、符号汇总等&#xff0c;检查无误后将…

uniapp在自定义tabbar上动态修改svg图标颜色和字体颜色

需求:在uniapp项目内,自定义tabbar,需要将图标更换成svg格式,可动态修改图标及字体颜色。 效果图如下: 我使用的是uniapp结合uview2的组件使用,代码如下: <u-tabbar :value="currentIndex" @change="tabbarChange" :fixed="true" :a…

三、Angular 路由

一、简介 Angular 的路由服务是一个可选的服务&#xff0c;它用来呈现指定的 URL 所对应的视图。它并不是Angular 核心库的一部分&#xff0c;而是位于 angular/router 包中。像其他 Angular 包一样&#xff0c;路由服务在用户需要时才从此包中导入。 [1]. 创建路由模块 默认…

C语言——字符函数和字符串函数(二)

&#x1f4dd;前言&#xff1a; 上一篇文章C语言——字符函数和字符串函数&#xff08;一&#xff09;对字符函数和字符串函数strlen&#xff0c;strcpy和strncpy&#xff0c;strcat和strncat进行了初步的讲解 这篇文章主要再讲解几个我们常用到的其他字符串函数&#xff08;附…

【C语言字符函数和字符串函数(二)】--strcmp,strstr的使用和模拟实现,strncpy,strncat,strncmp函数的使用,strock,strerror函数的使用

目录 一.strcmp的使用和模拟实现 1.1--strcmp的使用演示 1.2--strcmp的模拟实现 二.strstr的使用和模拟实现 2.1--strstr的使用演示 2.2--strstr的模拟实现 三.strncpy函数的使用 3.1--strncpy的代码演示 3.2--strncpy的模拟实现 3.3--比较strcpy和strncpy函数 四.…

白玉兰奖综艺类别入围名单公布 奖项即将揭晓

第30届上海电视节白玉兰奖入围名单在综艺类别中已经公布,最终获奖结果将在6月27日的“白玉兰绽放”颁奖典礼上揭晓。责任编辑:zhangxiaohua

曝理想汽车计划打造家庭轿车 或对标保时捷Panamera

据多方消息,国内造车新势力领军企业理想汽车正计划进军家庭轿车市场,其首款轿车产品疑似对标知名豪华品牌保时捷的Panamera车型。在最近的一季度财报会上,理想汽车CEO李想透露了公司进入轿车市场的计划。他表示,在现有增程SUV和纯电MPV产品线的市场表现达到预期后,将根据市…

t002-在线装修管理系统的设计与实现

项目视频演示 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息…

vue3 各种数据处理

1.对数组去重, 并取出想要的值 用途&#xff1a;获取此数组中共有几个名字 方法&#xff1a;...new Map&#xff0c;map,values() 示例&#xff1a; let aar [{id: 1, name: name1, value: value1},{id: 1, name: name1, value: value2},{id: 2, name: name2, value: value…

广西瓜农因收购价低把西瓜扔进池塘 市场饱和致价格偏低

5月29日,广西扶绥县的瓜农因西瓜滞销和收购价低而面临困境。一些瓜农选择将西瓜扔进池塘或任其烂在地里。山圩镇的一名瓜农表示,今年西瓜的收购价仅为每斤两毛钱,远低于往年水平,预计自己将亏损四五万元,地里有约10万斤西瓜被丢弃。一位西瓜收购商指出,收购价确实较低,这…

德国真会向乌提供金牛座导弹吗 态度摇摆不定

德国总理默茨上任以来,在是否向乌克兰提供“金牛座”远程巡航导弹问题上的态度一直摇摆不定。他在26日参加活动时提到,英国、法国、德国和美国“已不再限制援助乌克兰武器的射程”,这一言论引发了外界关于德国是否已经批准向乌克兰提供“金牛座”导弹的各种猜测。路透社报道…

孙俪唇下痣系因车祸玻璃碴致假性痣“孙俪唇下痣没了”

5月28日,演员孙俪出席时尚芭莎年度派对时,人们注意到她唇下的痣不见了。随后,孙俪工作室发布了一组照片,证实了这一点。两天后,“孙俪唇下痣没了”这一话题登上热搜。早在《甄嬛传》播出期间,孙俪唇下的小黑点就引起了观众的关注。到了《芈月传》和《那年花开月正圆》播出…

17岁学生登顶珠峰保送清华?学校回应 并无此类招生计划

近日,多家媒体报道称北京第八十中学17岁的学生李浩榕成为中国首位从北坡登顶珠峰的青少年,并登上热搜。然而,根据国内媒体报道,河北16岁女孩丁禹琪在2020年也曾从北坡成功登顶珠峰。西藏登山协会证实,在中国业余登山爱好者中,李浩榕是珠峰北坡登顶的最年轻男性,丁禹琪是…

确定男女关系第二天 她就开始借钱...

今年年初,郑先生谈了一个女朋友,期间女方向他借了多笔钱。现在两人分手后,郑先生希望能把钱要回来。郑先生是四川人,今年40岁,离异两年,独自抚养一个孩子。他在杭州从事物流运输工作已有六年。郑先生找到记者是因为和一名女子产生了纠纷。该女子向他借了12万元,承诺每月…

这些“牛奶”不仅浪费钱还没营养 减肥路上的“绊脚石”

早餐奶、核桃奶、巧克力奶,这些“牛奶”你还在喝吗?如果购买的牛奶包装上标有“调制乳”或“含乳饮料”,那么它们可能是减肥路上的绊脚石,不仅浪费钱还缺乏营养。调制乳是以不低于80%的生牛(羊)乳或复原乳为主要原料,添加其他原料或食品添加剂或营养强化剂制成。例如早餐…

【QT】理解QT机制之“元对象系统”

目录 前置知识&#xff1a; &#xff08;1&#xff09;C运行时多态 &#xff08;2&#xff09;RTTI QT的元对象系统 1.元对象系统基本内容 2.元对象代码 3.元对象系统其它特性 前置知识&#xff1a; 在理解Qt的元对象系统之前&#xff0c;有必要理解C的动态多态相关知识…

男子蹭2天爱心小面顿顿2斤多 暖心之举遭遇“羊毛党”

上海面馆老板为困难人士提供免费重庆小面,男子连蹭两天“爱心小面”,顿顿吃两斤多。老板:我们也是农民,我们也很辛苦,你这样子我们也吃不消。” 暖心老板提供免费面被薅羊毛狂吃。责任编辑:zhangxiaohua

“苏超”战火端午再燃 十三城绿茵对决

当粽香与呐喊齐飞,绿茵共龙舟同频。江苏城市足球联赛在端午佳节迎来第三轮对决。十三座城市的足球悍将身披战袍,将龙舟精神注入绿茵场,让楚汉豪情碰撞江南热血,用足球为端午小长假点燃战火。“苏超”斗图第一波上线,带你直击“端午大战”前哨战。十三城用创意图片互放“狠…