Spring源码相关

总分结构回答,突出关键接口、类、方法名

run -> AbstractApplicationContext.refresh()程序的入口

在IOC中的操作都是基于DefaultListableBeanFactory

bd对象保存在map集合中


refresh方法宝包括了整个Spring的执行流程和bean的完整生命周期
某些情况下实例化bean的过程比较复杂,可以实现BeanFactory接口定制bean的实例化逻辑

Spring是如何检测是否存在循环依赖的:
使用列表来记录正在创建中的bean,bean创建之前,先去记录中看一下是否在列表中,如果在说明存在循环依赖,如果不在,则将其加入到这个列表,bean创建完毕之后,将其再从列表中移除

问题1:谈谈对SpringIoc的理解

名词及注意:

循环依赖得以解决的根本愿意:Spring中bean的实例化和初始化是分开执行的

RuntimeBeanReference

三级缓存访问顺序:一级-》二级-》三级

objectFactories中保存的是lambda,当调用getObeject时,才会真正执行代码

优点:类似于回调机制,可以选择暴露

三级缓存放前提:

判断是否允许提前暴露  (单例bean、bean正在创建过程中、允许循环引用)

——————————————————————————————————————————

BeanFacoty:访问ioc容器的根接口

IOC Inversion of Controller(控制反转):关键点:谁控制谁?控制了什么? ioc不是一种技术,而是一种思想,在程序中主动控制对象的创建转为接受容器为调用者的成员进行赋值。

Spring提供了一个IOC容器对这种思想进行了落地实现,使用map结构来进行对象存储,ioc容器中通常存在三级缓存,使用singletonObjects保存成品对象,earlierSingletonObjects保存的是半成品对象,singletonFactories保存的是创建对象的工厂,bean对象的生命周期是IOC容器所管理的

BeanFactory,表示SpringIOC容器,实现类为DefaultListableBeanFactory【bean实例化和获取的具体类】

在IOC流程中,先是获取了一个BeanFactory的实现类DefaultListableBeanFactory(后续的操作都是基于此实例进行的),调用prepareFactory方法做了一些准备工作,各种(属性填充)bd对象在此载入(来源@ComponentScan @Import @Configuration xml ),生成相应的bd对象,。【在invokeBeanFactoryPostProcessors 前bd对象就存在,不过不是完整的bd对象,

bd对象的注册(也就是配置文件的读取是在实例化ApplicaitonContext过程中就完成的)

xml的注册  xml - 》dom4j -> document ->nodeList

注解:获取要扫描的类,判断类上是否存在注解  

BeanFactoryPostProcessors是Spring的一个拓展点,(二次开发使用较多)】对BeanFactory提供了额外的拓展操作,如:字符串的替换

finishBeanFactoryInitialization中完成bean对象的创建和初始化工作 

方法调用过程:getBean -》doGetBean -》createBean -> doCreateBean -populateBean

流程:获取所有的beanName(注意不是从bd对象中获取)

以A中依赖bean,B中依赖A为例,总共需要执行两次该过程
1.从三级缓存中查找是否存在bean,不存在根据beanName获取bd对象,根据bd对象判断是否是单例bena,分支-》单列bean和原型bean创建

创建bean:

createBeanInstance:创建bean实例

允许提前暴露,则将创建bean的factory添加到三级缓存中

populateBean bean属性的填充 

population中进行:获取要注入属性的RuntimeBeanReference,进行解析,getBean

先实例化A

此时三级缓存中已经有对象A和对象B

第三遍getBean(当查看三级缓存中存在对象A时【将A对象存入二级缓存中,并删除三级缓存中对的A对象】,返回实例化对象)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/141857.html

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

相关文章

day2作业

1,输入两个数,完成两个数的加减乘除 #输入两个数,完成两个数的加减乘除 num1int(input("请输入第一个数:")) num2int(input("请输入第二个数:")) print(str(num1)str(num2)str(num1num2)) print(str(num1)-str(num2)str…

Elasticsearch—(MacOs)

1⃣️环境准备 准备 Java 环境:终端输入 java -version 命令来确认版本是否符合 Elasticsearch 要求下载并解压 Elasticsearch:前往(https://www.elastic.co/downloads/elasticsearch)选择适合你的 Mac 系统的 Elasticsearch 版本…

开学选什么样的电容笔好用?ipad可以用的手写笔

自从ipad等平板电脑开始使用电容笔以来,电容笔已经完全代替了我们的手指,并且使我们的书写速度有了很大的提高。但由于Apple Pencil内置的高科技芯片,价格始终居高不下,这让不少人,尤其是在校学生,也是难以…

【C++】C++ 类中的 this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

文章目录 一、全局函数 与 成员函数 相互转化1、成员函数转为全局函数 - 多了一个参数2、全局函数转为成员函数 - 通过 this 指针隐藏操作数 二、有参构造函数设置默认参数值三、返回匿名对象与返回引用四、完整代码示例 一、全局函数 与 成员函数 相互转化 1、成员函数转为全局…

【PyTorch攻略(1/7)】 张量基本语法

一、说明 Tensor 是一种特殊的数据结构,与数组和矩阵非常相似。在 PyTorch 中,我们使用张量对模型的输入和输出以及模型的参数进行编码。 张量类似于 NumPy 和 ndarray,除了张量可以在 GPU 或其他硬件加速器上运行。事实上,张量和…

STM32单片机入门学习(四)-蜂鸣器

蜂鸣器接线 低平蜂鸣器,低电平发声,高电平不发声, 三个排针,VCC接3.3v,GND接地,I/O接A0口,如图: 蜂鸣器代码:响一秒停半秒 #include "stm32f10x.h" #includ…

Elasticsearch 部署学习

文章目录 Elasticsearch 部署学习1. 单节点部署 elasticsearch1.1 部署 jdk1.2 下载 elasticsearch1.3 上传文件并修改配置文件1.4 启动1.5 问题总结1.6 浏览器验证 2. 集群部署 elasticsearch3. 常用命令4. Elasticsearch kibana安装:one: 参考部署文档:two: 下载对应版本的安…

AI 编码助手 Codewhisperer 安装步骤和使用初体验

文章作者:为了自己加油 最近亚⻢逊云科技推出了一款基于机器学习的AI编程助手 Amazon Code Whisperer,可以实时提供代码建议。在编写代码时,它会自动根据现有的代码和注释给出建议。Amazon Code Whisperer与 GitHub Copilot 类似,…

MT1184矩形相交 题解【超详细】

目录 题目 样例 题目解析 代码 图解 矩形相交 题目 输入2个矩形的左上角和右下角两个点的坐标值(x,y),判断2个矩形是否相交,输出YES或者NO。矩形的边应与x,y轴相平行。假定输入坐标能顺利构成矩形,不考虑无效矩形…

Centos7安装go解释器

Centos7安装go解释器 下载解压go压缩包编辑go变量结果验证 下载解压go压缩包 # 下载 wget -c https://go.dev/dl/go1.20.2.linux-amd64.tar.gz# 解压到指定目录 tar xvf go1.20.2.linux-amd64.tar.gz -C /usr/local/编辑go变量 /etc/profile.d/go.sh # 指定go执行程序位置 e…

【操作系统笔记九】并发安全问题

用户态抢占和内核态抢占 内核中可以执行以下几种程序: ① 当前运行的进程:陷阱程序(系统调用) 和 故障程序(page fault) ,进程运行在内核态的时候,其实就是在执行进程在用户态触发的…

Spring面试题11:什么是Spring的依赖注入

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说Spring的依赖注入 依赖注入(Dependency Injection)是Spring框架的一个核心特性,它是指通过外部容器将对象的依赖关系注入到对象中,从而…

论文笔记:ST2Vec: Spatio-Temporal Trajectory SimilarityLearning in Road Networks

2022 KDD 1 intro 现有的轨迹相似性学习方案强调空间相似性而忽视了时空轨迹的时间维度,这使得它们在有时间感知的场景中效率低下 如上图,在拼车过程中,T1表示司机计划的行程,T2和T3是两个想要搭车的人。T1和T2在空间上更接近&am…

怒刷LeetCode的第15天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一:哈希表双向链表 方法二:TreeMap 方法三:双哈希表 第二题 题目来源 题目内容 解决方法 方法一:二分查找 方法二:线性搜索 方法三:Arrays类的b…

【MySql】2- 基础篇(下)

文章目录 1. MySQL锁1. 1 全局锁1. 2 表级锁1. 3 行锁1. 3 .1 两阶段锁1. 3 .2 死锁和死锁检测 2. 事务是否是隔离的?2.1 快照在MVCC中如何工作 1. MySQL锁 数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合…

入门级制作电子期刊的网站推荐

随着数字化时代的到来,越来越多的人开始尝试制作自己的电子期刊。如果你也是其中的一员,那么这篇文章可以帮助你制作电子期刊。无论是初学者还是有一定经验的制作者,都能快速完成高质量的电子期刊制作 小编经常使用的工具是-----FLBOOK在线制…

[RF学习记录][ssh library][execute Command】关键字的返回值

有时候需要判断通过ssh在远程机器上执行的命令是否正常,使用关键字Execute Command可以在远程机器上运行命令,但是默认不加任何参数的话,没有看到范返回值,而这个关键字是带了几个参数的,简单的试验了下这几个参数&…

SAP Oracle表空间扩展技术手册

1、DBACOCKPIT下查看表空间 当表空间不足(达到99%)时,需要按以下步骤扩充表空间(每次扩充20000M,20G): (也可以通过DB13,DB02查看表空间) 新浪博客 Tablespace PSAPSR3 is 100% used | SAP Community Oracle是通过增加数据文件的方式来为表空间扩容。为指定表空间增…

Mock.js之Element-ui搭建首页导航与左侧菜单

🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《Spring与Mybatis集成整合》《springMvc使用》 ⛺️ 生活的理想,为了不断更新自己 ! 1、Mock.js的使用 1.1.什么是Mock.js Mock.js是一个模拟数据的生成器,用来帮助前…

【LeetCode热题100】--189.轮转数组

189.轮转数组 数组翻转: 当我们将数组的元素向右移动k次后,尾部k mod n个元素会移动至数组 头部,其余元素向后移动k mod n个位置 该方法为数组的翻转:我们可以先将所有元素翻转,这样尾部k mod n个元素就被移至数组头…