Spring Bean实例化和初始化的过程
承接上文Spring Bean生命周期
应用程序在运行过程中能否去读取当前系统的环境变量或系统属性?
这里涉及到一个非常重要的接口Environment,
System.getenv,System.getProperties都是获取当前系统环境变量,
Environment接口的实现类AbstractEnvironment,AbstractEnvironment的实现类StandardEnvironment,


在当前容器运行之前或运行前置的某些方法里面的时候,就会调用这些方法将环境变量或系统属性放到environment里面去,方便应用程序后续进行调用,比如springmvc init-param指定的初始化方法读取环境变量之后,放到environment中去,这就是environment对象存在的意义。
AbstractApplicationContext这个类refresh方法中包含13个方法,refresh是Spring框架最核心的方法之一,
执行下面的代码,debug来看下创建对象的过程,


super调用父类的构造方法,相当于做了一些属性值的设置,

设置xml配置文件路径,方便后面进行读取和加载。
refresh方法调用prepareRefresh是刷新前的准备工作:设置关闭和活跃的标志位。
细节的东西不想看,没关系,但要知道这个是前期做一些准备工作,方便后面创建对象。

配置文件经过读取之后要放到容器里面去,所以第一步先应该有对应的容器工厂或者有bean工厂,当有了BeanFactory之后,才能进行相关的加载工作,所以第一步应该先创建一个容器,当把容器创建好了之后,下一步才读取配置文件。

obtainFreshBeanFactory.refreshBeanFactory,这个方法里面,先判断容器里面有没有bean工厂,如果有的话,销毁掉,如果没有的话,先创建一个bean工厂,因为需要先有bean工厂之后,才能完成当前对象的加载工作。
有了bean工厂之后,设置下序列化的id和自定义配置下工厂的属性值,这样就完成了整个工厂的创建工作。
当完成创建工作之后,第二步loadBeanDefinitions是加载配置文件,因为这个配置文件中有1个bean,所以当执行完这样的加载工作之后,beanDefinitionMap和beanDefinitionNames里面有一个bean,

目前已经把bean对象转换成了bean definition了,下一步该调用beanFactoryPostProcessor进行增强处理,

prepareBeanFactory给beanfactory做准备工作,因为刚刚new了一个对象,还没有给beanFactory做任何属性赋值操作,这个方法就是给beanFactory做一些初始化工作即给当前的beanFactory设置某些具体的属性值。


这是一个模版方法,留给子类进行扩展的。

接下来执行beanFactoryPostProcessor,当这个步骤执行完了之后,下一步该实例化了,
在进行实例化的时候,相对而言会比较复杂,实例化的时候包含非常多的步骤。
在实例化之前需要做什么准备工作?
要提前把后面需要用到的beanPostProcessor准备好,如果想在整个bean的spring生命周期里面,在不同的阶段做不同的处理工作,监听器 、监听事件、多播器等这些东西都要提前准备好,只有把这些准备好之后,才能进行后续的调用工作,这是一整个流程,不可能用的时候再准备。

这一步是注册beanPostProcessor,这是还没有执行,只是先提前准备好。

如果是SpringMVC项目,messagesource就是用来做国际化的操作的。

初始化当前应用程序的事件多播器,

注册监听器。
在实例化之前所有需要做的准备工作都做完了,这几个方法都是预先的准备工作。

接下来该实例化了,实例化所有剩下的非懒加载的单例对象,
finishBeanFactoryInitialization.preInstantiateSingletons该方法是实例化剩下的单例对象,终于要开始实例化了。
当前容器里面有一个bean,目标是把这个bean放到一个集合里面去。
首先看容器里面有没有这个bean,
getBean(beanName).doGetBean
默认情况下都是单例的,


通过反射的方式创建具体的bean对象,

获取到对应的构造器对象,


获取实例化的策略并且进行实例化,


获取到构造器并实例化,

实例化的时候,只是在堆中开辟内存空间并没有给属性赋值,

接下来是填充属性,

在执行populateBean方法之前,当前bean对象这3个值都等于空,

执行完之后,name完成了属性填充,但beanName不会填充,因为beanName是aware接口,现在还没有执行Aware接口的实现类,

接下来执行这些实现了aware接口的方法,

此时beanName就有了,为什么environment没有设置?

因为在prepareBeanFactory方法中对这个Aware接口进行了忽略,


本身的invokeAwareMethods方法也没有对EnvironmentAware进行处理,


调用每个postProcessBeforeInitialization方法,

执行到这里,此时就已经是一个完整的对象了,

即执行完getBean(beanName)得到了一个完整的对象了。
因为当前集合里面只有一个对象,所以此时循环就结束了,当前这个bean完成了实例化且初始化。
相关文章:
Spring Bean实例化和初始化的过程
承接上文Spring Bean生命周期应用程序在运行过程中能否去读取当前系统的环境变量或系统属性?这里涉及到一个非常重要的接口Environment,System.getenv,System.getProperties都是获取当前系统环境变量,Environment接口的实现类AbstractEnviro…...
WorkTool企微机器人接入智能问答
一、前言 最新版的企微机器人已经集成 Chat ,无需开发可快速搭建智能对话机器人。 从官方介绍看目前集成版本使用模型为 3.5-turbo。 二、入门 创建 WorkTool 机器人 你可以通过这篇快速入门教程,来快速配置一个自己的企微机器人。 实现的流程如图&…...
C导入正则库问题
环境 操作系统:win11 专业版 gcc: gcc (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0 编辑器:vscode 要求 在c中使用正则表达式 遇到的问题以及解决思路 C标准中并没有正则表达式库 从其他地方下载正则表达式库即可。 http://gnuwin32.sourcefo…...
尚融宝05-Node.js入门
目录 一、Node.js的概念 1、JavaScript引擎 2、什么是Node.js 二、下载和安装 1、下载和安装 2、查看安装是否成功 三、初始Node.js程序 1、运行一个程序 常见问题 2、文件的读取 3、服务器端程序 三、Node.js的作用 1、Node.js的应用场景 2、BFF 解决什么问题 …...
「SAP ABAP」OPEN SQL(八)【WHERE语句大全】
💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言A…...
Ribbon负载均衡的原理(源码分析)
SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的。1)LoadBalancerIntercepor可以看到这里的intercept方法,拦截了用户的HttpRequest请求,然后做了几件事:1.request.getURI():获取请…...
用sql计算两个经纬度坐标距离(米数互转)
目录 一、sql示例(由近到远) 二 、参数讲解 三、查询效果 - 距离(公里 / 千米) 四、查询效果 - 距离(米) 五、距离四舍五入保留后2位小数(java) 一、sql示例(由近到远…...
C语言详解KMP算法
如果给你一个字符串 和 该字符串的一个子字符串 你能否快速找出该子字符串的所在位置我猜 这里会有一群杠精 说可以找到 真的吗 那下面这个字符串你可以一眼看出来吗你能找出来吗 如果能 算你眼神好 如果不能 那就看看接下来我怎么做你有想到暴力求解法吗?——来自百…...
redis在window上安装与自启动
需求: 客户window服务器使用redis,需要配置成在window服务中,并且可以随着电脑自启动服务。 下载 https://github.com/tporadowski/redis/releases打开上面的下载地址,这里我们下载zip压缩版本。 解压到待安装目录下ÿ…...
字符串匹配【BF、KMP算法】
文章目录:star:BF算法代码实现BF的改进思路:star:KMP算法🚩next数组🚩代码实现优化next数组最终代码⭐️BF算法 BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将主串S的第一个字符与模式串P…...
Leetcode.1616 分割两个字符串得到回文串
题目链接 Leetcode.1616 分割两个字符串得到回文串 Rating : 1868 题目描述 给你两个字符串 a和 b,它们长度相同。请你选择一个下标,将两个字符串都在 相同的下标 分割开。由 a可以得到两个字符串: aprefix和 asuffix,…...
剑指 Offer II 033. 变位词组
题目链接 剑指 Offer II 033. 变位词组 mid 题目描述 给定一个字符串数组 strs,将 变位词 组合在一起。 可以按任意顺序返回结果列表。 注意:若两个字符串中每个字符出现的次数都相同,则称它们互为变位词。 示例 1: 输入: strs [“eat”,…...
spring-cloud-sentinel ---流控算法---review
计数器算法 计数器算法,限定每个固定时间能处理的请求总数,例如1分钟100,如果在第一个一分钟,总共请求60次,接着第二个一分钟,counter又会从0 开始技术,如果在1.5分钟的时候,达到了…...
1.浅析NIO 多路复用器selector
一:IO基本介绍 Java共支持3种网络编程IO模式:BIO,NIO,AIO 0.Java对BIO、NIO、AIO的支持: Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端…...
Day920.结构化日志业务审计日志 -SpringBoot与K8s云原生微服务实践
结构化日志&业务审计日志 Hi,我是阿昌,今天学习记录的是关于结构化日志&业务审计日志的内容。 1、什么是结构化日志 结构化日志(Structured Logging)是一种将日志信息组织为结构化数据的技术。 传统的日志通常是一些文…...
前端代码复用学习笔记:整洁架构与清晰架构
基础代码的复用往往比较简单,但是业务代码的复用通常是困难的,如果没有特殊的手段去治理项目会逐渐发展为难以维护的巨石应用,按照维基百科记载,代码的复用形式主要有三种,程序库,应用框架,设计…...
【python刷题】leecode官方提示“->“,“:“这些符号是什么意思?什么是Type Hints?
作者:20岁爱吃必胜客(坤制作人),近十年开发经验, 跨域学习者,目前于海外某世界知名高校就读计算机相关专业。荣誉:阿里云博客专家认证、腾讯开发者社区优质创作者,在CTF省赛校赛多次取得好成绩。…...
【华为OD机试真题2023 JAVA】最佳对手
华为OD机试真题,2023年度机试题库全覆盖,刷题指南点这里 最佳对手 知识点排序DFS搜索回溯 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 游戏里面,队伍通过匹配实力相近的对手进行对战。 但是如果匹配的队伍实例相差太大,对于双方游戏体验都不会太好。 给定n个…...
css实现文字大小自适应
在页面编写中经常会碰到页面自适应的问题,也就是页面内部的元素会随着窗口的放大缩小而放大缩小,box可以通过calc 百分比的形式做到页面自适应,但是box内的字体却无法做到这点,往往box自适应大小了,内部的字体还是原来…...
【Redis】搭建哨兵集群
目录 集群结构 准备实例和配置 启动 测试 集群结构 这里我们搭建一个三节点形成的Sentinel集群,来监管之前的Redis主从集群。如图: 三个sentinel实例信息如下: 节点IPPORTs1192.168.150.10127001s2192.168.150.10127002s3192.168.150.…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...
CTF show 数学不及格
拿到题目先查一下壳,看一下信息 发现是一个ELF文件,64位的 用IDA Pro 64 打开这个文件 然后点击F5进行伪代码转换 可以看到有五个if判断,第一个argc ! 5这个判断并没有起太大作用,主要是下面四个if判断 根据题目…...
ubuntu中安装conda的后遗症
缘由: 在编译rk3588的sdk时,遇到编译buildroot失败,提示如下: 提示缺失expect,但是实测相关工具是在的,如下显示: 然后查找借助各个ai工具,重新安装相关的工具,依然无解。 解决&am…...
