源码:Spring常规Bean创建过程

news2024/11/16 21:26:49

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.coloradmin.cn/o/1396985.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文阅读】Can Large Language Models Empower Molecular Property Prediction?

文章目录 0、基本信息1、研究动机2、创新性3、方法论4、实验结果 0、基本信息 作者&#xff1a;Chen Qian, Huayi Tang, Zhirui Yang文章链接&#xff1a;Can Large Language Models Empower Molecular Property Prediction?代码链接&#xff1a;Can Large Language Models E…

Java项目:10 Springboot的电商书城管理系统

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 该系统分为前台展示和后台管理两大模块&#xff0c;前台主要是为消费者服务。该子系统实现了注册&#xff0c;登录&#xff0c;以及从浏览、下…

栈、队列专题

文章目录 栈栈的概述栈的实现栈在函数调用中的应用栈在表达式求值中的应用逆波兰表达式求值 栈在括号匹配中的应用有效的括号最长的有效括号删除字符串中的所有相邻重复项 如何获取栈内最小元素呢如何实现浏览器的前进和后退 队列队列的定义队列的实现循环队列队列的应用队列在…

解决百度地图在模拟器上运行报 java.lang.IllegalArgumentException: No config chosen问题

解决百度地图在模拟器上运行报 java.lang.IllegalArgumentException: No config chosen 问题 1. 问题复现 在近期公司使用模拟器(网易MuMu)进行项目演示时&#xff0c;在进入存在百度地图(Android版本 7.4.2版本)之后&#xff0c;页面出现奔溃&#xff0c;后台日志为&#xf…

比吸收率(SAR)

本文旨在介绍比吸收率&#xff08;Specific Absorption Rate&#xff09;的基本知识。搬运自https://www.antenna-theory.com。英语够用的朋友可以直接移步。感谢网站创始人Peter Joseph Bevelacqua教授的无私奉献。 ------------------我是分隔线------------------- 比吸收…

Halcon 一维测量

文章目录 算子矩形算子弧形算子移动到新的参考点 Halcon 案例测量保险丝的宽度&#xff08;边缘对测量&#xff09;使用助手进行测量 halcon 案例获取芯片引脚的个数平均宽度距离&#xff0c;连续两个边缘的距离&#xff08;measure_pos &#xff09;halcon 定位测量Halcon 测量…

23 SEMC外扩SDRAM

文章目录 23.1 SDRAM 控制原理23.2 SEMC 简介 23.1 SDRAM 控制原理 RT1052 系列芯片扩展内存时可以选择 SRAM 和 SDRAM 由于 SDRAM 的“容量/价格”比较高&#xff0c;即使用 SDRAM 要比 SRAM 要划算得多。 给 RT1052 芯片扩展内存与给 PC 扩展内存的原理是一样的 PC 上一般…

庞伟:《一本书读懂企业破产法》——企业危机解决之道

在当今复杂多变的市场环境中&#xff0c;企业破产问题日益凸显。如何妥善解决企业危机&#xff0c;保障各方利益&#xff0c;成为了业界关注的焦点恰逢北京市亿达律师事务所成功入选第一届北京市破产管理人协会并成为会员单位之际&#xff0c;为此&#xff0c;北京市亿达律师事…

(2023版)斯坦福CS231n学习笔记:DL与CV教程 (56) | 卷积神经网络

前言 &#x1f4da; 笔记专栏&#xff1a;斯坦福CS231N&#xff1a;面向视觉识别的卷积神经网络&#xff08;23&#xff09;&#x1f517; 课程链接&#xff1a;https://www.bilibili.com/video/BV1xV411R7i5&#x1f4bb; CS231n: 深度学习计算机视觉&#xff08;2017&#xf…

多目标优化中常用的差分进化算法DE【2】

# 多目标优化中常用的进化算法 1、链接一 2、链接二 #后续继续补充多目标的差分进化算法MODE的应用 此链接介绍很详细&#xff0c;此处用来分享学习&#xff0c;后续有问题会继续进行补充。 如果你觉得不错&#xff0c;佛系随缘打赏&#xff0c;感谢&#xff0c;你的支持是…

(六)深入理解Bluez协议栈之“GATT Client Profile”

前言: 本章节我们继续介绍GATT Client Profile的实现,参考的程序是tools\btgatt-client.c,需要注意的一点,在./configure时,需要添加 --enable-test --enable-testing才会编译该c文件,编译完成后,生成的可执行程序为btgatt-client。本文主要以btgatt-client运行时可能会…

分布式ID(2):雪花算法生成ID

1 雪花算法简介 这种方案大致来说是一种以划分命名空间(UUID也算,由于比较常见,所以单独分析)来生成ID的一种算法,这种方案把64-bit分别划分成多段,分开来标示机器、时间等,比如在snowflake中的64-bit分别表示如下图(图片来自网络)所示: 41-bit的时间可以表示(1L&l…

ARM 1.16

TCP的特点 面向连接 面向连接&#xff0c;是指发送数据之前必须在两端建立连接。建立连接的方法是“三次握手”&#xff0c;这样能建立可靠的连接。建立连接&#xff0c;是为数据的可靠传输打下了基础。 仅支持单播传输 每条TCP传输连接只能有两个端点&#…

面试题16.15.珠玑妙算

前言 这两天突然发现力扣上还是有我能写出来的题的&#xff0c;虽说都是简单级别的&#xff08;以及一道中等的题&#xff09;&#xff0c;但是能写出来力扣真的太开心了&#xff0c;&#xff08;大佬把我这段话当个玩笑就行了&#xff09;&#xff0c;于是乎&#xff0c;我觉…

linux单机部署mysql(离线环境解压即可)

一、下载官网压缩包&#xff08;tar.gz&#xff09; MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/根据自己的操作系统发行版本、位数、gclib版本、mysql版本来选择对应的压缩包 比如我是 linux系统debian10&#xff08;官网只有linux ge…

Doris配置外表以及多个Hive外表的配置

1.场景分析 以Clickhouse、Doris、Starrocks等为代表的mpp分析数据库正在快速的兴起&#xff0c;以其高效查询、跨库整合能力收到广大技术人员的喜爱。本文主要浅显介绍下作者在使用Doris时&#xff0c;通过建立catlog进行跨库查询。 废话不多少&#xff0c;直接上代码 2.相关…

RIP基础实验配置

要使用RIP完成以上命令需求 1&#xff0c;首先划分ip地址 有图可见有四个网段需要划分 192.168.1.0/26 192.168.3.0/26 192.168.7.0/26 192.168.5.0/26 给两个骨干网段&#xff0c;给两个环回接口&#xff0c;由下图所示&#xff1a; 其次&#xff0c;规划好ip后在各个接口…

hash应用

目录 一、位图 1.1、引出位图 1.2、位图的概念 1.3、位图的应用 1.4、位图模拟实现 二、布隆过滤器 2.1、什么是布隆过滤器 2.2、布隆过滤器应用的场景 2.3、布隆过滤器的原理 2.4、布隆过滤器的查找 2.5、布隆过滤器的插入 2.6、布隆过滤器的删除 2.7、布隆过滤器…

操作系统-操作系统的运行机制(内核程序 应用程序 特权指令 非特权指令 内核态 用户态 变态)

文章目录 总览预备知识&#xff1a;程序是如何运行的&#xff1f;内核程序vs应用程序特权指令vs非特权指令内核态vs用户态用户态&#xff0c;内核态的切换小结 总览 预备知识&#xff1a;程序是如何运行的&#xff1f; 转换为机器码放入内存&#xff0c;然后按顺序执行 内核…

跟着pink老师前端入门教程-day06

十一、CSS 的背景 通过CSS背景属性&#xff0c;可以给页面元素添加背景样式 背景属性可以设置背景颜色、背景图片、背景平铺、背景图片位置、背景图像固定等。 11.1 背景颜色 background-color 属性定义了元素的背景颜色 一般情况下元素背景颜色默认值是transparent&…