一文读懂SpringIoC的工作原理和机制(面试经)

导览

  • 前言
  • IoC(Inversion of Control)必学必看
    • 1. DI(Dependency Injection)
    • 2. IoC核心思想
    • 3. 创建Bean的方式
      • 3.1 构造函数
      • 3.2 构造静态方法
      • 3.3 构造实例工厂方法
    • 4 依赖注入的方式
      • 4.1 setter注入
      • 4.2 构造方法注入
      • 4.3 接口注入
  • 结语
  • 精彩回顾

前言

我们在使用Spring框架时,经常会提到IoC吧?虽然你在开发的时候,不会留太多的时间(或者没有时间)去琢磨“为什么要这样做”,但是通常会知道“这样做准没问题”。这显然没有任何问题,因为在996/007的背景下,如果谁还有时间去琢磨它怎么回事,那么可能会带来“工作不饱和”的恶果。

但是,学习归学习,工作任工作,如果能够挤一点时间,多想想“这是为什么”,我想还是事倍功倍的。正所谓“天底下,没有白费的努力,也没有一无所获的付出”。总有一天你曾经洒下的汗水,会在未来的某天以一朵惊艳之花,笑迎你的归来。

今天博主给大家讲讲Spring中的IoC吧,可以说它是Spring成功的关键技术。
在这里插入图片描述

IoC(Inversion of Control)必学必看

In software engineering, inversion of control (IoC) is a programming technique in which object coupling is bound at run time by an assembler object and is typically not known at compile time using static analysis

一句话总结:在软件工程领域,控制反转技术是对象或程序的一部分的控制被转移到容器或框架中,它常用于面向对象编程的上下文(Context)中。

那么它有哪些优点呢?且看下文:

  • 任务的实现与执行分离;
  • 在不同的实现中,自由切换;
  • 模块化程度更高;
  • 通过隔离组件或模拟其依赖关系并允许组件通过“契约”进行通信,便于测试;

说到这里,不得不提DI了,这又是什么东东?

1. DI(Dependency Injection)

Dependency Injection is a pattern through which to implement IoC, where the control being inverted is the setting of object’s dependencies.The act of connecting objects with other objects, or “injecting” objects into other objects, is done by an assembler rather than by the objects themselves.

一句话总结:依赖注入是实现IoC的一种模式,由程序而非对象本身完成。通过注入实现对象之间的绑定。

举个例子,在没有使用DI前,我们是这么处理对象之间的关系的:

// 新建一个对象,并引用另外一个对象,通过new实现
public class TextEditor{private SpellChecker sc;public TextEditor(){sc = new SpellChecker();}
}

在使用了DI后,它是这样的:

// 通过构造器注入另外一个对象
public class TextEditor{private SpellChecker sc;public TextEditor(SpellChecker spellChecker){this.sc = spellChecker;}
}

在这里,TextEditor不应该担心SpellChecker的实现。SpellChecker将独立实现并在TextEditor实例化时提供给TextEditor,该过程是由Spring Framework控制的。因此,控制流已经被依赖注入(DI)“反转”,因为您已经有效地将依赖性委托给某些外部系统。简单讲,我们直接“撒手不管”了,全权交付外部系统“一手操办”

是不是很高效?

2. IoC核心思想

org.springframework.beans和org.springframework.context包提供了对Spring框架的IoC容器的基础。其中,BeanFactory接口提供了一种能够管理任何性质的对象的高级配置机制;而ApplicationContext接口构建于BeanFactory(它是一个子接口)之上,并添加了其他功能。例如更容易与Spring的AOP功能集成,消息资源处理,事件传播和应用程序的上下文,如WebApplicationContext用于Web应用中。

org.springframework.beans.factory.BeanFactory是Spring IoC容器的表示,负责管理上述bean。配置元数据可以由XML,Java注释或Java代码表示。Spring IoC容器利用Java POJO类和配置元数据来生成完全配置和可执行的系统或应用程序。
我们可通过下图理解这一过程:
在这里插入图片描述
这个过程,就像你在组装一台车。在出厂前,需要完成轮胎的安装、发动机的安装,以及最后的集成安装等工序。

3. 创建Bean的方式

A bean definition can be seen as a recipe for creating one or more actual objects. The container looks at the recipe for a named bean when asked, and uses the configuration metadata encapsulated by that bean definition to create (or acquire) an actual object.

一句话总结:Spring容器根据需要进行对象的实例化。

3.1 构造函数

使用构造函数方法创建bean时,所有普通类都可以使用并与Spring兼容。也就是说,正在创建的类不需要实现任何特定接口或以特定方式编码。只需指定bean类就足够了。
例如:

<bean id='spellChecker' />

3.2 构造静态方法

当使用静态工厂方法定义要创建的bean以及指定包含静态工厂方法的类的class属性时,需要另一个名为factory-method的属性来指定工厂方法本身的名称。
例如:

<bean id='spellChecker' factory-method='createInstance'></bean>

3.3 构造实例工厂方法

使用实例工厂方法的实例化是调用容器中现有bean的工厂方法来创建新bean。

<bean id='myBeanFactory' class='xxx.FactoryBean'></bean>
<bean id='spellChecker' factory-bean='myBeanFactory' factory-method='createInstance'></bean>

4 依赖注入的方式

4.1 setter注入

基于Setter的DI,是通过在调用无参数构造函数或无参数静态工厂方法来实例化bean之后,再调用bean上的setter方法来实现的。

例如:

// 通过set方法DI
public class TestSetterDI{MyBean bean = null;public void setMyBean(MyBean myBean){this.bean=myBean;}
}

4.2 构造方法注入

基于构造函数的DI,是通过调用具有多个参数的构造函数来实现,每个参数代表一个协作者。

例如:

// 通过构造器DI
public class TestConstructorDI{MyBean bean = null;public TestConstructorDI(MyBean myBean){this.bean=myBean;}
}

4.3 接口注入

通过接口的实现类将依赖注入到目标对象中。

例如:

// 定义一个接口
public interface Ibusiness{public void create(MyBean myBean);
}
// 通过实现类完成DI
public class Business implements Ibusiness{MyBean bean = null;public void create(MyBean myBean){this.bean= myBean;}
}

结语

本文主要介绍了SpringIoc的核心原理和实现方法,相关知识是面试必答环节,好好研习一下,可助你通关哦。

走过的、路过的盆友们,点点赞,收收藏,并加以指导,以备不时之需哈~

精彩回顾

一文读懂SpringMVC的工作原理
Springboot中基于X509完成SSL检验的原理与实践
基于springboot+enum配置化实践


在这里插入图片描述

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

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

相关文章

QDY421F-40C DN80 液动紧急切断阀

在深入探讨QDY421F-40C DN80液动紧急切断阀的优越性能时&#xff0c;不得不提及其在工业自动化与安全防护领域中的核心作用。这款阀门采用先进的液动驱动技术&#xff0c;能够在紧急情况下迅速响应&#xff0c;实现介质的快速切断&#xff0c;有效防止了潜在的事故扩大&#xf…

CSS链接

链接是网站的重要组成部分&#xff0c;几乎在每个网页上都能看到不少的链接&#xff0c;合理的设计链接的样式能够给网页的颜值加分。链接有四种不同的状态&#xff0c;分别是 link、visited、active 和 hover&#xff0c;可以通过以下伪类选择器来为链接的四种状态设置不同的样…

项目经理的“七宗罪”

项目经理作为团队的领导者&#xff0c;承担着确保项目按时、按质、按预算完成的重任。然而&#xff0c;即便是最经验丰富的项目经理&#xff0c;在追求项目成功的道路上也难免会遇到各种误区与挑战。 第一宗罪&#xff1a;盲目乐观 症状&#xff1a;对项目难度估计不足&#…

自己偷偷玩!(NSFW)无内容审查大模型推荐

大家好&#xff0c;我是画画的小强 今天给大家推荐几个(NSFW)无内容审查的大模型&#xff0c;可以让你部署在本地电脑运行&#xff01; CausalLM-14B CausalLM-14B 是基于阿里通义实验室的大模型 Qwen-14B 加入其他中文数据集训练而来&#xff0c;经过量化和 DPO 算法的重构…

Simple Calculator(简单计算器:算法初阶,代码基础,“纯”手撕)

简单计算器&#xff1a;仅适用无括号加减乘除&#xff0c;算法初阶&#xff0c;代码基础&#xff0c;不调库或模块“纯”手撕。 (笔记模板由python脚本于2024年09月22日 12:08:02创建&#xff0c;本篇笔记适合喜欢用python解决实际问题的coder翻阅) 【学习的细节是欢悦的历程】…

都说网络安全缺口那么大,但为何招聘数量却不多?总算明白了!

为啥网安领域缺口多达300多万人&#xff0c;但网安工程师也就是白帽黑客却很少&#xff0c;难道又是砖家在忽悠人&#xff1f; 原因主要为这三点: 首先是学校的原因&#xff0c;很多学校网络安全课程用的还都是十年前的老教材&#xff0c;教学脱离社会需求&#xff0c;实操技能…

AbMole揭秘3D类器官技术解锁SARS-CoV-2子宫内膜感染新视角

近期&#xff0c;一项由知名科研机构发起的研究&#xff0c;通过创新的3D类器官技术&#xff0c;深入剖析了SARS-CoV-2对子宫内膜的潜在影响&#xff0c;特别是其对垂直传播机制的独特见解&#xff0c;为疫情防控和妊娠安全提供了新的视角。 传统的研究方法受限于二维细胞培养…

牛牛的快递最小花费爬楼梯数组中两个字符串的最小距离

目录 1.牛牛的快递 2.最小花费爬楼梯 3.两个字符串的最小距离 1.牛牛的快递 牛牛的快递_牛客题霸_牛客网 算法思路&#xff1a; 这是一道非常简单的模拟题目&#xff0c;不多做介绍&#xff0c;扩展两个库函数&#xff0c;ceil()向上取整&#xff0c;floor()向下取整。 2.最…

思想和认知,从身边的事情和从小经历就在培养。谁在起跑线!

世界地图就像一张藏宝图&#xff0c;有的地方有宝藏&#xff0c;有的地方物资匮乏。当你拼命努力却一直挖不到宝藏的时候&#xff0c;不妨换个位置挖掘。如果你运气好&#xff0c;很可能就挖到一堆金子直接实现财富自由。运气不好&#xff0c;也能轻松过上小康生活。财富和位置…

低电平电压-电流转换器电路

1 简介 该电路可以为负载 RL 提供精确的低电平电流 IL。该设计由 5V 单电源供电&#xff0c;并使用一个精密低漂移运算放大器和一个仪表放大器。经过简单修改即可更改电压-电流 (V-I) 转换器的范围和精度。 2 设计目标 2.1 输入 2.2 输出 ​​​ 2.3 电源 2.4 负载电阻 3 电…

大规模数据处理:分库分表与数据迁移最佳实践

什么是分库分表 分库分表是一种数据库架构优化策略&#xff0c;它将数据分散存储在多个数据库或表中&#xff0c;以此来提高系统的可扩展性和性能。 虽然分库分表能够提升系统的整体性能&#xff0c;但是也不要一上来就分库分表&#xff0c;如果系统在单表的情况下&#xff0…

Python酷库之旅-第三方库Pandas(128)

目录 一、用法精讲 571、pandas.DataFrame.T属性 571-1、语法 571-2、参数 571-3、功能 571-4、返回值 571-5、说明 571-6、用法 571-6-1、数据准备 571-6-2、代码示例 571-6-3、结果输出 572、pandas.DataFrame.transpose方法 572-1、语法 572-2、参数 572-3、…

自建dns获取域名解析与证书告警

新钛云服已累计为您分享813篇技术干货 背 景 公司A拥有一套云上DNS服务&#xff0c;主要用于支持云中应用和服务的域名解析。为了满足线下门店之间的服务互联需求&#xff0c;公司在内网自建一套Windows DNS服务器&#xff0c;以实现门店之间的高效域名解析。此方案旨在保证内部…

css动态边框

参考&#xff1a; Clip-path实现按钮流动边框动画_在线clip-path-CSDN博客 https://www.5axxw.com/questions/simple/9ju5yt#google_vignette <div class"bottom-top-item-centent bottom-top-item-left"><vue-seamless-scroll :data"listLeftData&q…

脚本命令类恶意代码——PowerShell混淆脚本分析方法

由于PowerShell具有强大的系统管理和自动化能力&#xff0c;它可以被用于执行恶意代码、进行横向移动、执行无文件攻击等恶意行为。其中&#xff0c;Office宏病毒是一种常见的恶意软件形式&#xff0c;它利用Office文档中的宏代码来调用PowerShell并执行恶意行为。这种攻击方式…

PostgreSQL 17 发布了!非常稳定的版本

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、My…

观众IMDB热评9.1分,HBO新作到底有什么魅力

HBO年度大作《企鹅人》终于上线&#xff0c;IMDb评分高达9.1&#xff0c;成为观众热议的焦点。这部剧集的魅力不仅在于其背后的强大制作团队&#xff0c;更在于角色的深度与故事的复杂性&#xff0c;让人忍不住想要深入探讨。 首先&#xff0c;HBO一向以高质量的剧集著称&#…

有关若依登录过程前端的对应处理学习

导言 在用C#搞完个后端后想用若依的前端做对接&#xff0c;不过很久没搞过若依了&#xff0c;想趁这个二次开发的过程记录熟悉一下登录的过程 过程 验证&#xff0c;在permission.js的路由守卫&#xff0c;这里在用户发起api请求时会验证用户的请求是否有token&#xff0c;对…

【LeetCode】动态规划—63. 不同路径 II(附完整Python/C++代码)

动态规划—63. 不同路径 II 前言题目描述基本思路1. 问题定义:2. 理解问题和递推关系:3. 解决方法:3.1 动态规划方法3.2 空间优化的动态规划 4. 进一步优化:5. 小总结: 代码实现Python3代码实现Python 代码解释C代码实现C 代码解释 总结: 前言 本文将探讨“不同路径 II”这一问…

图神经学习笔记

图神经网络基础 图神经网络用于挖掘事物的“普遍联系”&#xff0c;理解原理、应用技术。本文汇总图神经网络相关介绍和基础模型。 图及特性 图是由顶点和边组成的&#xff0c;如下图左所示。一般图中的顶点表示实体对象&#xff08;比如一个用户、一件商品、一辆车、一张银行…