一文读懂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.rhkb.cn/news/433094.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是Node.js?

为什么JavaScript可以在浏览器中被执行&#xff1f; 在浏览器中我们加载了一些待执行JS代码&#xff0c;这些字符串要当中一个代码去执行&#xff0c;是因为浏览器中有JavaScript的解析引擎&#xff0c;它的存在我们的代码才能被执行。 不同的浏览器使用不同的javaScript解析引…

阴影的基本原理

1、现实中阴影的产生规则 如图所示&#xff0c;现实中的阴影产生规则是&#xff0c;在不考虑光线反射的前提下&#xff0c;当一个光源发射的一条光线遇到一个不透明物体A时&#xff0c;这条光线就不能够再继续照亮其他物体了&#xff08;物体B的一部分&#xff09;&#xff0c…

等保2.0数据库测评之达梦数据库测评

一、达梦数据库介绍 达梦数据库管理系统属于新一代大型通用关系型数据库&#xff0c;全面支持 ANSI SQL 标准和主流编程语言接口/开发框架。行列融合存储技术&#xff0c;在兼顾 OLAP 和 OLTP 的同时&#xff0c;满足 HTAP 混合应用场景。 本次安装环境为Windows10专业版操作…

Docker:解决开发运维问题的开源容器化平台

云计算de小白 Docker是一个开源的容器化平台&#xff0c;可以将应用程序及其依赖的环境打包成轻量级、可移植的容器。 Docker为什么这么受欢迎呢?原因很简单&#xff1a;Docker可以解决不同环境一致运行的问题&#xff0c;而且占用资源少&#xff0c;速度快。 所以好的东西…

erlang学习:Linux命令学习6

for循环学习 打印九九乘法表 for i in {1..9};do %%取1-9for j in $(seq 1 $i);do %%取1-iecho -n "$j*$i$((i*j)) " %%进行九九乘法表打印doneecho done尝试了很多次报错是因为后面的换行符不对&#xff0c;window系统中的换行符与linux对不上&#xff0c;因…

Spring Boot 快速入门教程

1. Spring Boot 简介 Spring Boot 是一个基于 Spring 框架的项目&#xff0c;它简化了基于 Spring 的 Java 应用程序的创建和部署。Spring Boot 通过提供一系列的“Starters”来简化 Maven 配置&#xff0c;同时使用约定大于配置的原则&#xff0c;让开发者能够以最少的配置启…

李沐深度学习-多层感知机、模型选择、过拟合、欠拟合

3.8.1 隐藏层 多层感知机在单层神经网络的基础上引入了一到多个隐藏层&#xff08;hidden layer&#xff09;。隐藏层位于输入层和输出层之间。图3.3展示了一个多层感知机的神经网络图&#xff0c;它含有一个隐藏层&#xff0c;该层中有5个隐藏单元。 图3.3 带有隐藏层的多层感…

Windows环境部署Oracle 11g

Windows环境部署Oracle 11g 1.安装包下载2. 解压安装包3. 数据库安装3.1 执行安装脚本3.2 电子邮件设置3.3 配置安装选项3.4 配置系统类3.5 选择数据库安装类型3.6 选择安装类型3.7 数据库配置3.8 确认安装信息3.9 设置口令 Oracle常用命令 2023年10月中旬就弄出大致的文章&…

铨顺宏科技携RTLS+RFID技术亮相工博会!

中国国际工业博览会盛大开幕&#xff01; 铨顺宏科技展亮点速递 铨顺宏科技展位号&#xff1a;F117 中国国际博览会今日开幕&#xff0c;铨顺宏科技携创新产品亮相&#xff0c;吸引众多参观者。 我们珍视此次国际盛会&#xff0c;将全力以赴确保最佳体验。 工作人员热情解答…

深度剖析OnlyFans:超越AI的盈利模式与未来挑战

引言 近年来&#xff0c;OnlyFans以其惊人的收入水平震惊了硅谷&#xff0c;2022年的66亿美元营收远超OpenAI的34亿美元。本文将深入探讨OnlyFans的成功原因、商业模式以及面临的AI挑战&#xff0c;试图揭示其在付费内容生态中的独特地位。 OnlyFans的商业模式 OnlyFans成立…

Solidity——抽象合约和接口详解

&#x1f680;本系列文章为个人学习笔记&#xff0c;目的是巩固知识并记录我的学习过程及理解。文笔和排版可能拙劣&#xff0c;望见谅。 Solidity中的抽象合约和接口详解 目录 什么是抽象合约&#xff1f;抽象合约的语法接口&#xff08;Interface&#xff09;的定义接口的语…

MySQL_插入、更新和删除数据

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

使用Electron打包一个Vue3项目全步骤

1.创建一个Vue3项目 2.使用 WebStorm打开项目&#xff0c;并安装依赖项 npm install 等待完成后&#xff0c; 安装electron npm install --save-dev electron 等待完成后&#xff0c; 安装electron 打包依赖项(打包成可执行文件) npm install electron-packager --save-dev 3…

【大模型-驯化】成功解决载cuda-11.8配置下搭建swift框架

【大模型-驯化】成功解决载cuda-11.8配置下搭建swift框架 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 相关内容文档获取 微信公众号 &…

油气田可视化管理:精准监测与高效生产

通过图扑可视化技术实时监测油气田运行数据&#xff0c;优化生产流程&#xff0c;提高资源利用率和安全性&#xff0c;实现精准化管理。

如何在谷歌浏览器上玩大型多人在线游戏

在如今的数字时代&#xff0c;谷歌浏览器已经成为了许多人上网冲浪的首选工具。除了浏览网页、观看视频之外&#xff0c;你还可以在谷歌浏览器上畅玩各种大型多人在线游戏。本文将为你详细介绍如何在谷歌浏览器上玩大型多人在线游戏的步骤。 &#xff08;本文由https://chrome…

AWS Network Firewall - 配置只应许白名单域名出入站

参考链接 https://repost.aws/zh-Hans/knowledge-center/network-firewall-configure-domain-ruleshttps://aws.amazon.com/cn/blogs/networking-and-content-delivery/deployment-models-for-aws-network-firewall/ 1. 创建防火墙 选择防火墙的归属子网&#xff08;选择公有…

WinForm程序嵌入Web网页

文章目录 前言一、三方库或控件的选择测试二、Microsoft Edge WebView2安装、使用步骤1.安装2.使用 前言 由于此项目需要winform客户端嵌入web网页并于JAVA端交互数据&#xff0c;所以研究了一下嵌入web网页这部分&#xff0c;趟了一遍雷&#xff0c;这里做下记录。 一、三方库…

C# 委托(Delegate)二

一.委托的多播&#xff08;Multicasting of a Delegate&#xff09;&#xff1a; 委托对象&#xff0c;使用 "" 运算符进行合并&#xff0c;一个合并委托调用它所合并的两个委托。使用"-" 运算符从合并的委托中移除组件委托。 注&#xff1a;只有相同类型…

微服务-流量染色

1. 功能目的 通过设置请求头的方式将http请求优先打到指定的服务上&#xff0c;为微服务开发调试工作提供便利 请求报文难模拟&#xff1a;可以直接在测试环境页面上操作&#xff0c;流量直接打到本地IDEA进行debug请求链路较长&#xff1a;本地开发无需启动所有服务&#xf…