3.是人就能学会的Spring源码教学-IOC容器的核心实现原理

news2025/1/16 11:14:43


是人就能学会的Spring源码教学-IOC容器的核心实现原理

我们学习Spring源码的动力,估计大部分人都是因为面试中会问到吧。

那么我们今天就以面试问Spring来开头。

关于Spring,在面试的时候一般会问到的两个最基础的问题。

第一个什么是IOC?

第二个是什么是AOP?

这是在面试中最经常问到的,也是Spring相关的最基础的问题了,也是面试官面试的时候的一个切入点。

想要弄懂AOP,就得先弄懂IOC,所以我们以IOC来开头。

IOC是啥?

可能大家都知道,IOC就是控制反转嘛。以前我们的代码中需要对象的时候,都是我们自己创建,New一个对象或者使用工厂模式来获取一个对象,这个操作是我们主动去做的,换句话说,就是由我们自己控制的。但是使用了IOC思想之后,我们就变了。

我们不再自己去创建一个对象,而是从Spring容器中去获取对象。我们获取到的对象是由Spring容器创建的。当我们需要对象的时候,直接去IOC容器中获取就可以了。

以上对于IOC是什么的回答,我们大部分人都知道,毕竟也没什么难的。

但是接下来面试官就会更进一步地追问里面的关键点。

里面的关键点是什么?

Spring容器里面对象是怎么创建的?采用怎样的方式,包含哪些流程?

具体问出来的问题可能就是:

  1. 请你说说FactoryBean和BeanFactory的区别
  2. 聊一聊ApplicationContext和BeanFactory的区别
  3. 源码中使用了哪些设计模式
  4. 请你聊一聊Bean的生命周期
  5. 说一下循环依赖
  6. 三级缓存
  7. ……

面试官的问题逐渐深入,我们慢慢就开始回答不上来了,招架不住了。面试官得意洋洋,我们的脸色却越来越难看。

我们岂可被面试官给难住?下面我们就是来解决这些问题。

我们聊到Spring,都会想到一个名字,容器。不管是叫Spring容器,还是IOC容器,都是一个东西。

各位道友都听说这个名字吧,用过Spring的道友,肯定听说过一些对应的描述。

什么是容器?

容器不就是用来装东西的器具,比如我们生活中的水杯、瓶子、碗等等,都是容器。

那么IOC容器想来也是用来装东西的了,那么它是用来装什么的?

对,就是大家想的那种。

IOC容器就是用来装载Bean对象的容器。说白了就是将我们需要的对象一个一个创建好了,放到这个容器里面。

现在假设各位道友都是Spring的设计人员,那么大家会怎么来设计这个IOC容器,怎么在IOC容器中保存这些Bean对象,以便在需要这些Bean对象的时候,就可以在这个容器快速地获取到?

首先我们是不是得先创建好一个容器,然后容器里面放置一堆的Bean对象?就如下图所示的这样。

image-20230507180945627

容器里面该设计一个怎样的数据结构来保存这些Bean对象?

我想应该有道友应该想到了,用map。使用键值对的结构,key是Bean的名称,value就是Bean对象。这样我们想要获取Bean对象就非常方便了。只要能够提供Bean的名称,就能够获取到Bean对象。

这一点的我们可以看类DefaultSingletonBeanRegistry证实这一点。

image-20230507180229420

之后我们该如何从IOC容器中获取这些Bean对象?

我们有经验的道友们肯定知道,可以通过IOC容器的getBean方法获取。

image-20230507181721617.png

调用getBean方法,我们可以提供Bean的名称,也可以提供Bean的Class类等参数来获取Bean对象。

image-20230507181837289

这个思想应该很好理解。

我们理解了IOC容器里面Bean对象是以怎么的数据结构放置的,也知道了我们如何去获取IOC容器里面的Bean对象。那么IOC容器里面的Bean对象是怎么出现的?难不成是凭空出现的?

当然不是。

所以各位道友,我们就该知道,在创建容器之后,肯定还有一个步骤用来创建Bean对象来放置容器中去

该如何来创建对象放到容器中?或者说各位道友们,知道几种创建对象的方法?

  1. 直接New一个对象
  2. 用反射创建对象
  3. 使用工厂模式创建对象
  4. ……

方法获取有很多,但是Spring作为一个框架应该会用哪一种方法呢?

New一个对象?似乎不太可能。Spring作为一个框架怎么会知道我们会创建哪些类。

所以最可能的方式还是使用反射。毕竟只要获取到一个类的全限定名,就可以通过反射创建出对象来。

想到这里,我们发现还有一个问题。

IOC容器怎么知道创建哪些对象?

刚才我们也说了,通过一个类的全限定名,就可以创建出一个对象来。那么这个全限定名从哪里来。类有这么多,容器怎么知道创建哪些对象?

不知道我们有多少道友知道,一开始使用Spring可是需要创建一个xml文件的,就像下面这样。

<bean id="bookService" class="com.xxx.service.impl.BookServiceImpl">
    <property name="bookDao" ref="bookDao"/>
</bean>

一个bean的标签就定义了一个bean对象的描述信息,这个描述信息描述了啥?

描述了创建并初始化Bean的所有信息,包括:Bean对象的名称,Bean对象的全限定类名,初始化方法……

IOC容器拿到了这些Bean对象的描述信息,就可以从中获取到足够的信息来创建bean对象。

在Spring中,这个Bean对象的描述信息就放在类BeanDefinition中。我们可以从类的注释中看的出来。

image-20230507200205498

当然如果道友们不知道这种方式也没有关系。

用过Spring的道友肯定知道注解@Component@Service@Controller这些注解吧。其实是一个意思,只不过是方式不同,主要的目的都是告诉容器,哪些类是需要创建Bean对象的。

到现在,我们所理解的IOC容器的实现原理应该如下图所示。

image-20230507201617328

下一篇文章,我们再细细聊一聊容器是如何根据Bean对象的描述信息来创建Bean对象的。

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

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

相关文章

技术控,看这里,一款支持断点调试的数据科学工具

数据科学是一门利用统计学、机器学习、数据挖掘、数据可视化等技术和方法&#xff0c;从数据中提取知识和信息的交叉学科。自上世纪60年代&#xff0c;统计学家John W.Tukey首次提出“数据分析”&#xff08;Data Analysis&#xff09;的概念起&#xff0c;数据科学已历经了几十…

ASEMI代理ADUM131E1BRWZ-RL原装ADI车规级ADUM131E1BRWZ-RL

编辑&#xff1a;ll ASEMI代理ADUM131E1BRWZ-RL原装ADI车规级ADUM131E1BRWZ-RL 型号&#xff1a;ADUM131E1BRWZ-RL 品牌&#xff1a;ADI /亚德诺 封装&#xff1a;SOIC-16-300mil 批号&#xff1a;2023 安装类型&#xff1a;表面贴装型 引脚数量&#xff1a;16 工作温度…

基于springboot的“智慧食堂”设计与实现(源码等)

摘要 随着Internet的发展&#xff0c;人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化&#xff0c;网络化和电子化。网上管理&#xff0c;它将是直接管理“智慧食堂”系统的最新形式。本xx是以构建“智慧食堂”系统为目标&#xff0c;使用java技术制作…

智能仿写软件-智能伪原创改写软件

智能仿写工具&#xff1a;营销创意的必备利器 在当今快节奏和不断发展的商业环境中&#xff0c;企业营销人员需要在短时间内产生大量有创意和高质量的内容。因此&#xff0c;智能仿写工具作为营销策略的一种创新方法而出现&#xff0c;可以帮助企业的写作团队更快速地生成文章…

【软考数据库】第八章 数据库SQL语言

目录 8.1 SQL语言概述 8.2 数据库定义 8.2.1 创建表(create table) 8.2.2 修改表 (alter table) 8.2.3 删除表 (drop table) 8.2.4 索引 8.2.5 视图 8.3 数据操作 8.3.1 查询语句格式 8.3.2 分组查询 8.3.3 其他操作 8.3.4 约束 8.4 数据授权 8.4.1 授权grant 8…

数据库索引的原理,为什么要用 B+树,为什么不用二 叉树?

1、B树和B树 一般来说&#xff0c;数据库的存储引擎都是采用B树或者B树来实现索引的存储。首先来看B树&#xff0c;如图所士 B树是一种多路平衡树&#xff0c;用这种存储结构来存储大量数据&#xff0c;它的整个高度会相比二叉树来说&#xff0c;会矮很多。 而对于数据库而言…

RFID系统在物流仓储中的应用

RFID系统是一种无线识别技术&#xff0c;最近成为物流仓储行业的热门话题。本文将介绍RFID系统在物流仓储中的应用&#xff0c;包括如何使用RFID标签进行物流管理&#xff0c;如何使用RFID技术提高仓库的安全性&#xff0c;并细述RFID技术在物流仓储中的优势。除此之外&#xf…

ArrayList快速失败机制

文章目录 一、什么是快速失败机制二、例子三、底层原理四、解决方法五、快速失败机制的一个小bug 一、什么是快速失败机制 ArrayList实现了一种称为快速失败(fail-fast)的机制,该机制在并发修改时会抛出ConcurrentModificationException异常。 这种机制的实现原理是:ArrayList…

机器学习案例 | 通过EBG学习概念cup

基于解释的学习(explanation-basedlearning)可简称为解释学习&#xff0c;是20世纪80年代中期开始兴起的一种机器学习方法。解释学习根据任务所在领域知识和正在学习的概念知识&#xff0c;对当前实例进行分析和求解&#xff0c;得出一个表征求解过程的因果解释树&#xff0c;以…

spark2

18Spark中stage的划分 和 shuffle的概念 Stage的划分是根据宽依赖&#xff0c;当触发action算子时&#xff0c;按照从后往前的回溯算法&#xff0c;当遇到会发生shuffle算子的时候&#xff0c;就会切分stage。 Stage的划分本质是shuffle,即当遇到会发生shuffle算子的时…

E. Sergey and Subway(思维 + dp)

Problem - E - Codeforces Sergey Semyonovich 是 N 市县的市长&#xff0c;他一直在思考如何进一步改善 Nkers 的生活。不幸的是&#xff0c;几乎所有可以做的事情都已经完成了&#xff0c;白天他已经没有更多的想法&#xff08;他现在喜欢在晚上睡觉&#xff09;。然而&#…

MySQL 中的 distinct 和 group by 的区别

目录 distinct用法distinct多列去重 group by的使用单列去重多列去重 distinct和group by原理隐式排序基于上述原因&#xff0c;Mysql在8.0时&#xff0c;对此进行了优化更新&#xff1a; 结论推荐group by的原因 在语义相同&#xff0c;有索引的情况下&#xff1a;group by和d…

体验 Whisper

体验 Whisper 1. 什么是 Whisper2. Github 地址3. 创建虚拟环境4. 安装 ffmpeg5. 部署 Whisper6. 使用 Whisper 1. 什么是 Whisper Whisper 是一个通用的语音识别模型。它是在一个大型的不同音频数据集上训练出来的&#xff0c;也是一个多任务模型&#xff0c;可以进行多语言语…

MySQL笔记(一):设计范式、基础概念、数据库定义语言DDL

MySQL设计范式、基础概念、数据库定义语言DDL MySQL设计范式、基础概念、数据库定义语言DDL MySQL设计范式、基础概念、数据库定义语言DDL数据模型属性的特点 数据库的创建主键 数据库设计规范第一范式&#xff08;1NF&#xff09;第二范式&#xff08;2NF&#xff09;第三范式…

智能制造之路-从MES到MOM

当前&#xff0c;中国正在大力推动制造业的转型升级&#xff0c;实现由传统制造向智能制造转型。而制造信息化系统&#xff0c;作为支撑企业实现智能制造的一个关键因素&#xff0c;也正越来越多的吸引企业领导人的关注。 某大型制造业集团企业&#xff08;下文简称M集团&…

【Java虚拟机】JVM日志分析和可视化工具实操

1.JVM垃圾GC日志参数配置实战 Java虚拟机中垃圾收集器在运行过程中输出的日志信息主要用于分析垃圾收集器的运行状态、优化垃圾收集器的工作效率以及定位垃圾收集相关的问题GC日志会包含以下内容 垃圾收集器的名称和版本信息。垃圾收集器的运行时间、开始时间和结束时间。垃圾…

【Fluent】利用TUI命令在保存或导出文件时,给文件名加上时间步长、流动时间、迭代步数等求解过程变量的自动编码

一、问题背景 在CSDN的一篇博客&#xff08;从Fluent导出数据到txt文档&#xff09;中&#xff0c;一位博主分享了一串导出求解数据的TUI命令。 file/export/ascii data%t.txt () yes h2s y-velocity x-velocity q no 当时我不知道里面的%t是啥意思&#xff0c;估计是跟时间…

JMeter介绍与安装教程

简介 JMeter是一款开源的负载测试工具&#xff0c;它可以用于测试Web应用程序、API、数据库、负载均衡器等。JMeter 是由 Apache 软件基金会开发的&#xff0c;其目标是提供一个高性能、易于使用的负载测试工具。 JMeter 具有以下特点&#xff1a; 可扩展性&#xff1a;JMet…

又开发好一个系统,详细记录软著申请过程

经过几个通宵达旦的撸代码之后&#xff0c;又开发好了一个系统&#xff0c;和以往一样&#xff0c;系统开发好了少不了申请软件著作权证书&#xff0c;兄弟们&#xff0c;软著申请搞起来啊。 在版权保护中心后台提交资料&#xff0c;没有账号的需要先注册一个账号。很重要的一步…

停车场收费系统

1.系统的开发工具 1.1 AppServe集成应用 Mysql&#xff1a;MySQL 是一款安全、跨平台、高效的&#xff0c;并与 PHP、Java 等主流编程语言紧密结合的数据库系统。该数据库系统是由瑞典的 MySQL AB 公司开发、发布并支持&#xff0c;由 MySQL 的初始开发人员 David Axmark 和 Mi…