【Java】如何理解 Spring 核心概念: 什么是 IoC, 什么是 DI?

news2025/5/25 1:37:04

文章目录

  • 前言
  • 一、什么是Spring
    • 1, 什么是容器
    • 2, 什么是IoC
  • 二、如何理解IoC
    • 1, 传统方式的代码编写
    • 2, 控制反转的代码编写
    • 3, 再谈IoC
  • 三、什么是DI
  • 总结


前言

各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:
📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
📗 Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
📘 JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)

本篇开始陆续介绍 Java 中的 Spring 框架相关内容, 首先要理解 Spring 的核心概念和设计思想
在这里插入图片描述


提示:是正在努力进步的小菜鸟一只,如有大佬发现文章欠佳之处欢迎批评指点~ 废话不多说,直接上干货!

一、什么是Spring

Spring 指的是 Spring Framework(Spring 框架), Spring ⽀持⼴泛的应⽤场景, 它可以让 Java 企业级的应⽤程序开发起来更简单

Spring 的本质就是一个包含了众多工具方法的 IoC 容器


1, 什么是容器

字面意思, 就是可以容纳物品的装置, 可以是杯子, 花瓶, 碗…

在这里插入图片描述

之前学习过的数据结构, 顺序表, 链表, 栈, 哈希表… 这些也是容器, 只不过存储的是数据


2, 什么是IoC

IoC(Inversion of Control) 翻译成中⽂是 “控制反转” 的意思,也就是说 Spring 是⼀个“控制反转”的容器

  • 什么是"控制反转"? 控制什么? 反转什么?
    这里的控制说的是对代码的控制, 具体一点是对 Java 中对象的创建和销毁的控制
    这里的反转说的是上述的"控制权"不再在我们手上, 而是交给了 Spring

下面用代码来理解"控制反转"的设计思想


二、如何理解IoC

设定一个场景 : 要造一辆车(Car 类), 需要依赖车身(Frame 类), 车身需要依赖底盘(Bottom 类), 底盘需要依赖轮胎(Tire 类)

按照之前的代码编写方式, 每一个上层都需要依赖下层, 下面用代码展示这些类的依赖关系和调用栈

1, 传统方式的代码编写

在这里插入图片描述

使用如下代码执行上述代码逻辑

public class Test {
    public static void main(String[] args) {
        Car car = new Car();
        car.init();
    }
}

上述形式的代码, 由于当前需求所产生的依赖关系, Car 类需要调用 Frame 类的方法, 就必须先自己创建一个 Frame 类, 导致各个类之间的 耦合度非常高!!

如果我们需要给 Trie 类的构造方法新增参数, 就需要逐步更改整个调用栈的代码, 在实际的项目中, 这种情况非常麻烦非常恐怖

在这里插入图片描述

要改善这种"牵一发而动全身"的情况, 就必须降低各个类之间的耦合度, 如果我们不再自己创建类, 而是通过注入(传递)的方式来得到所需的类, 就不需要关心所需的类发生任何改变而牵动当前的代码

Spring 中, 类对象称作 Bean 对象, 获取 Bean 对象叫做"对象装配", 也叫做"对象注入", 后续文章会详细介绍


2, 控制反转的代码编写

在这里插入图片描述
我们通过传递参数的方式来获取到所需的类对象(Bean 对象), 这种方式就是"注入"

上述代码中没有 new 对象的操作, 注入进来的 Bean 对象是被谁 new 的? 实际上是被 Spring 框架创建的

我们用 Test 类来代替模拟 Spring (IoC 容器)

public class Test {
    private Car car;
    private Frame frame;
    private Bottom bottom;
    private Tire tire;
    public Test() {
        this.tire = new Tire();
        this.bottom = new Bottom(this.tire);
        this.frame = new Frame(this.bottom);
        this.car = new Car(this.frame);
    }
    
    public static void main(String[] args) {
        Test test = new Test();
        test.car.init();
    }
}

这样一来, 即便底层的代码需要修改, 也不需要更改整个调用链的代码, 这就实现了解耦合

  • 如何体现"控制反转"了?
    不再是 Car 控制和创建 Frame , Frame 控制并创建了 Bottom…, 控制反转之后 : 通过注入的方式, 把下级对象注入到当前对象, 下级的控制权不再由上级类控制

3, 再谈IoC

理解了 IoC 这个设计思想之后, 还要明确, 容器的作用就是 “存储” 和 “取出”

所以 Spring 就是一个包含众多工具方法的 IoC 容器, 意思就是, 把对象的创建和销毁的控制权交给 Spring 来管理, Spring 也具备存储和获取对象的能力

为什么要使用容器?

之前用顺序表, 链表, 哈希表, 二叉树…来存储数据, 就是为了不再每次使用的时候都创建, 而是从特定的容器里随用随取
现在用 IoC容器来存储对象, 也是为了不再每次使用的时候都 new 新的对象, 而是 new 了一次之后, 需要用的时候直接取, 用完再放回去方便以后使用


三、什么是DI

DI (Dependency Injection) , 依赖注入, 就是由 IoC 容器在运行期间,动态地将某种依赖关系注入到对象之中。

所以,依赖注入(DI)和控制反转(IoC)是从不同的⻆度的描述的同⼀件事情,就是指通过引入 IoC 容器,利用依赖关系注入的方式,实现对象之间的解耦

IoC 是一种设计思想, 而 DI 是具体的实现 IoC 思想的方式


总结

以上就是本篇的全部内容, Spring 就是一个包含众多工具方法的 IoC 容器, 意思就是, 把对象的创建和销毁的控制权交给 Spring 来管理, Spring 也具备存储和获取对象的能力, DI 是具体的实现 IoC 思想的方式

如果本篇对你有帮助,请点赞收藏支持一下,小手一抖就是对作者莫大的鼓励啦😋😋😋~


上山总比下山辛苦
下篇文章见

在这里插入图片描述

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

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

相关文章

网络安全学习(ing)

根据网站后缀猜测开发语言及服务常见端口及对应的服务 22 ssh 445 smb 漏洞ms17-010 永恒之蓝 3306 mysql 3389 rdp远程桌面连接服务 80 http 443 https (一)SSH爆破—模拟攻击 1.信息收集 nmap扫描目标主机的端口: nmap IP 发现22端口开放…

再次认识结构体

> 作者简介:დ旧言~,目前大一,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 望小伙伴们点赞👍收藏✨加关注哟💕&#x1…

软件工程学术顶会——ICSE 2023 议题(网络安全方向)清单与摘要

按语:IEEE/ACM ICSE全称International Conference on Software Engineering,是软件工程领域公认的旗舰学术会议,中国计算机学会推荐的A类国际学术会议,Core Conference Ranking A*类会议,H5指数74,Impact s…

Android 在一个APP里打开另一个APP

前言 不知道你们有没有注意过,每次打开一些软件的时候都会有广告引导页,有时候手滑点到了,会有进入手机上的另一个APP,这有没有引起你的注意呢? 运行效果图 # 正文 为了测试这个功能,首先要创建两个项目&…

019 - limit

limit:限制返回结果数量; 该LIMIT子句可用于约束SELECT语句返回的行数 。 LIMIT接受一个或两个数字参数,这些参数必须都是非负整数常量,但以下情况除外: 在准备好的语句中,LIMIT 可以使用? 占位符标记指…

双端队列(deque)与优先队列(priority_queue)

文章目录 一.双端队列——deque1.deque的优点与缺点2.deque的原理 二.优先队列——priority_queue1.什么是优先队列?2.优先队列的基本使用3.什么是仿函数?4.优先队列的模拟实现 一.双端队列——deque 在上一章stack、queue的模拟实现中,我们…

疲劳驾驶检测和识别2:Pytorch实现疲劳驾驶检测和识别(含疲劳驾驶数据集和训练代码)

疲劳驾驶检测和识别2:Pytorch实现疲劳驾驶检测和识别(含疲劳驾驶数据集和训练代码) 目录 疲劳驾驶检测和识别2:Pytorch实现疲劳驾驶检测和识别(含疲劳驾驶数据集和训练代码) 1.疲劳驾驶检测和识别方法 2.疲劳驾驶数据集 (1)疲…

whistle代理

安装whistle npm install whistle -g --registryhttps://registry.npm.taobao.org启动w2代理 w2 startchrome浏览器安装插件whistle,并启用代理状态 web端代理到本地 浏览器访问http://127.0.0.1:8899/ 配置代理url [参考] https://blog.csdn.net/u010106375/ar…

C语言:程序环境和预处理

编译一个C程序设计很多步骤,大致为预处理,编译,汇编和链接. 在讲解预处理阶段之前,先简单总述一下程序的编译和链接. 1. 程序的编译和链接 链接是将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可被加载(复制)到内存并执行. 这里有两个源文件构成了一个程序…

计算机内存中的缓存Cache Memories

这篇写一下计算机系统中的缓存Cache应用场景和实现方式介绍。 Memory hierarchy 在讲缓存之前,首先要了解计算机中的内存结构层次Memory hierarchy。也就是下图金字塔形状的结构。 从上到下,内存层次结构如下: 寄存器:这是计算机…

自动化测试与手工测试比较

既然现在有了自动化测试,甚至现在许多团队在使用人工智能的方法,逐渐让机器来取代人的测试。那么作为测试工程师的人未来会不会消失?这是一个摆在许多人面前的一个严肃的问题。去年刚刚过世的著名的天体物理学家斯蒂芬威廉霍金(Stephen William Hawking…

Qt - macOS 安装配置

文章目录 一、关于 QT1.2 Qt的发展史1.3支持的平台1.4 Qt版本1.5 Qt 的优点1.6 成功案例 二、软件安装1、保证已 Xcode 和 Command Line Tools2、下载 QT3、下载 [qtcreator](http://download.qt.io/official_releases/qtcreator/)查看qt版本 三、创建工程Qt 常见用法 四、基础…

智能安全配电装置应用场景有哪些?

安科瑞 华楠 一、应用背景 电力作为一种清洁能源,给人们带来了舒适、便捷的电气化生活。与此同时,由于使用不当,维护不及时等原因引发的漏电触电和电气火灾事故,也给人们的生命和财产带来了巨大的威胁和损失。 为了防止低压配电…

音频转换工具怎么使用你了解吗?让我来跟你分享背后原理

相信小伙伴们平时都会听听喜欢的音乐放松心情吧,不过你是否遇到过,想在一个播放设备上放一首歌的时候,却发现不支持该格式?音频转换格式软件在我们的生活中扮演着越来越重要的角色。这些软件可以帮助我们将音频文件转换成不同的格…

炒股最好用的5个指标?_通达信公式

摘要: 炒股市场是一个充满挑战的领域,而找到可靠的指标来辅助投资决策是成功的关键之一。在众多的指标中,神奇指标网提供了五个被广泛认为是炒股最好用的指标。本文将详细介绍这五个指标,包括其原理和如何应用它们来辅助投资决策。 导言: …

蓝桥杯专题-真题版含答案-【图形排版】【包子凑数】【位反序数】【自守数】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

Java进阶 —— 多进程并发

前言 在系统学完Java的面向对象编程之后,我们需要认真地来学习Java并发编程,我们在学习计算机操作系统的时候也都了解过进程、线程和协程的概念。在这篇文章中荔枝主要会梳理有关线程创建、线程生命周期、同步锁和死锁、线程通信和线程池的知识&#xff…

android app控制ros机器人一

android开发app,进而通过控制ros机器人,记录开发过程 查阅资料: rosjava使用较多,已经开发好的app也有开源的案例 rosjava GitHub https://github.com/ros-autom/RobotCA https://github.com/ROS-Mobile/ROS-Mobile-Android…

因果推断(一)合成控制法(SCM)

因果推断(一)合成控制法(SCM) 在互联网时代,产品迭代速度越来越快,营销活动也越来越多。分析师因此需要快速的量化每次迭代或每次营销的效果,探索改变与结果之间的因果关系,并将优秀…