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

news2024/9/29 13:24:16

文章目录

  • 前言
  • 一、什么是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/803530.html

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

相关文章

西安电子科技大学

前言 本篇文章投稿与以下活动 【西安城市开发者社区】探索西安高校:展现历史与创新的魅力 资料参考与百度百科 学校简介 西安电子科技大学(Xidian University),简称“西电”,位于陕西省西安市,是中央部…

聚焦东南亚五国 | 7月TikTok达人数据洞察

或许中国直播的盛况,就会在东南亚重演。 据超店有数洞察,2023年7月东南亚TikTok主销五国(印度尼西亚、泰国、越南、马来西亚、菲律宾)带货达人数量环比上涨14.7%,其中越南、泰国市场达人数增长幅度远超均值,分别为25.46%、17.16%。…

代码随想录算法训练营第三天| 203.移除链表元素 707.设计链表 206.反转链表

链表是一种通过指针串联在一起的线性结构, 单链表 单链表每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。 双链…

搭建JMeter+Jenkins+Ant持续化

在D盘下新建文件夹Test,在其中填充文件夹 在 ant中解压 “apache-ant-1.9.14-bin.zip” 在TestAudo中新建文件夹 进入pc文件夹继续新建文件夹并把准备好的build.xml拖入 在resultlog中新建两个空文件夹 名称分为 html jtl 把准备好的baidu.jmx放入script 配置环境变量 在环…

2023跨境电商有哪些热门的夏季选品类目?纯干货!快戳进来

1、厨房用品 夏季食材新鲜多样,所以厨房用品非常受欢迎。 冷水壶、冰桶、冰箱收纳盒等可帮助保持食材新鲜;烤肉架、烤盘、烤架、烤盘套装等是户外烧烤时的好帮手刨冰机、果汁机、冰淇淋机等可以制作各种冰凉饮品和甜品。 2、客厅用品 夏季在家放松休息&a…

数据结构—数组和广义表

4.2数组 数组:按一定格式排列起来的,具有相同类型的数据元素的集合。 **一维数组:**若线性表中的数据元素为非结果的简单元素,则称为一维数组。 **一维数组的逻辑结构:**线性结构,定长的线性表。 **声明…

婴儿床出口欧盟CE认证EN 1130办理指南

随着人们生活水平的不断提高,妈妈们对婴儿产品的要求也越来越高。作为新生儿最常用的家具之一,婴儿床的质量安全自然成为了消费者关注的焦点。而欧盟CE认证EN 1130就是婴儿床出口欧盟市场的必备证书,下面我们就来详细介绍一下该认证的办理流程…

C++网络编程 TCP套接字基础知识,利用TCP套接字实现客户端-服务端通信

1. TCP 套接字编程流程 1.1 概念 流式套接字编程针对TCP协议通信,即是面向对象的通信,分为服务端和客户端两部分。 1.2 服务端编程流程: 1)加载套接字库(使用函数WSAStartup()),创建套接字&…

ORB特征笔记

简介 ORB Oriented FAST Rotated BRIEF 前面的Oriented FAST说明的是它的关键点的选取是一种改良过的FAST,在FAST的基础上加了方向信息;后面的Rotated BRIEF是指特征描述符使用BRIEF描述子(Binary Robust Independent Elementary Featur…

赋能医院数字化转型,医院拍摄VR全景很有必要

医院有没有必要拍摄制作VR全景呢?近期也有合作商问我们这个问题,其实VR智慧医院是趋势、也是机遇。现在外面很多的口腔医院、医美机构等都开始引入VR全景技术了,力求打造沉浸式、交互式的VR智慧医院新体验,通过VR全景展示技术来助…

c# 此程序集中已使用了资源标识符

严重性 代码 说明 项目 文件 行 禁止显示状态 错误 CS1508 此程序集中已使用了资源标识符“BMap.NET.WindowsForm.BMapControl.resources” BMap.NET.WindowsForm D:\MySource\Decompile\BMap.NET.WindowsForm\CSC 1 活动 运行程序时&a…

javascript 模板引擎

使用场景 在实际开发中,一般都是使用动态请求数据来更新页面,服务器端通常返回json格式的数据,正常操作是我们手动的去拼装HTML,但麻烦且容易出错,因此出现了一些用模版生成HTML的的框架叫js模板引擎如:jq…

成本中心修改或者创建保存时增强的实现

成本中心修改或者创建保存时增强 用户出口程序为:EXIT_SAPLKMA1_003。 可以通过SMOD 或者 CMOD来添加增强代码。 CMOD->COOMKS02 ->EXIT_SAPLKMA1_003 按公司要求,写了段代码检查 创建利成本中心时,业务范围要规范输入。 data PRCTR…

对Windows应用程序进行代码签名

Windows上发布桌面应用程序,您可以看到带有“发布者:未知”的未正确签名的应用程序。 没有被签名的软件 因此,这里有一个有关经验教训的快速指南,可能会帮助您从一开始就正确签署安装程序。请注意,这些说明适用于对已…

环境搭建-Ubuntu18.04.6系统TensorFlow BenchMark的GPU测试

1. 下载Ubuntu18.04.6镜像 登录阿里云官方镜像站:阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 2. 测试环境 Server OS:Ubuntu 20.04.6 LTS Kernel: Linux 5.4.0-155-generic x86-64 Docker Version:24.0.5, build ced0996 docker-com…

数据结构之常见排序算法

文章目录 1.排序概念2.10种排序比较3.排序算法3.1直接插入排序(元素越有序,越高效)3.2希尔排序序( 缩小增量排序 )3.3直接选择排序3.5堆排序3.6冒泡排序3.8快速排序 递归实现(无序使用最好)3.8.1挖坑法 (建…

yo!这里是STL::string类简单模拟实现

目录 前言 常见接口模拟实现 默认成员函数 1.构造函数 2.析构函数 3.拷贝构造函数 4.赋值运算符重载 迭代器 简单接口 1.size() 2.c_str() 3.clear() 操作符、运算符重载 1.操作符[] 2.运算符 3.运算符> 扩容接口 1.reserve() 2.resize() 增删查改接口 …

JS常用操作数组的方法整理

JavaScript提供了许多用于操作数组的方法。以下是其中一些常见的方法: 1. push() : 将一个或多个元素添加到数组的末尾,并返回新数组的长度。 2. pop() : 移除并返回数组的最后一个元素。 3. unshift() : 将一个或多个元素添加到数组的开头&#xff0…

一做PPT就抓耳挠腮?老码农掏心分享,选对工具才能事半功倍

今天老陈闲来无事摸个鱼,逛社区的时候看到一条有趣的帖子,HR怒喷UI设计师垃圾,说他们还不如应届生毕业生有能力,设计能力菜的惊人,给老陈平淡的生活增加了不少乐趣。 底下的评论也很有意思,有人说视觉表现…

JavaScript正则表达式之座机号/手机号验证校验规则

引用:https://www.bilibili.com/read/cv18300539/ 本文对利用正则表达式对手机号码进行了验证 支持格式: 座机 :xxx-xxxxxxxx、xxxxxxxxxxxx …座机区号的横杠可有可无 手机:xxxxxxxxxxx JavaScript: var: checkPhone (rule,…