当前位置: 首页 > news >正文

什么是IoC?什么是Spring IoC?什么是DI?

首先说明 IoC 是一种思想,IoC的全称是Inversion of Control,翻译成中文叫做“控制反转”

用人话来说,IoC的思想就是将一个对象对另一个对象的控制权交出去(不必关心交给谁),从而让对象之间的依赖关系降低,降低代码之间耦合程度。

我们可以写一个简单的代码来举个例子

假如说我们现在要“造一台车”,那么我们首先需要一个车框架

public class Car {FrameWork frameWork;public Car(){frameWork.init();}
}

那么造好了车框架,我们需要在车框架上面安装一个底盘

public class FrameWork {Bottom bottom;public FrameWork(){bottom = new Bottom();bottom.init();}public void init(){System.out.println("i am framework......");}
}

那么造好了底盘,我们需要在底盘合适的位置安装好轮胎

public class Bottom {Tire tire;public Bottom(){tire = new Tire();tire.init();}public void init(){System.out.println("i am framework......");}
}

最后我们需要把轮胎造好,那么这辆车就拼装完成了

public class Tire {public void init(){System.out.println("i am tire......");}
}

假设我们有一天想要一辆定制的车,比如我想要一辆轮胎是17寸大小的车,那么我就需要传递参数将代码进行修改

//轮胎
public class Tire {int size;public Tire(int size){this.size = size;}public void init(){System.out.println("i am " + size + "tire......");}
}//底盘
public class Bottom {Tire tire;public Bottom(int size){tire = new Tire(size);tire.init();}public void init(){System.out.println("i am framework......");}
}//框架
public class FrameWork {Bottom bottom;public FrameWork(int size){bottom = new Bottom(size);bottom.init();}public void init(){System.out.println("i am framework......");}
}//车
public class Car {FrameWork frameWork;public Car(int size){frameWork = new FrameWork(size);frameWork.init();}
}

可以看到,我们需要层层向上,不断地修改代码来传递参数,从而达到“定制化的过程”

那么如果我们使用IoC的思想来实现这个“车”,代码应该就是这样的

    public class FrameWork {public FrameWork(Bottom bottom){bottom.init();}public void init(){System.out.println("i am framework......");}}public class Bottom {public Bottom(Tire tire){tire.init();}public void init(){System.out.println("i am bottom......");}}public class FrameWork {public FrameWork(Bottom bottom){bottom.init();}public void init(){System.out.println("i am framework......");}}    public class Car {public Car(FrameWork frameWork){frameWork.init();}}public static void main(String[] args) {Tire tire = new Tire(17);Bottom bottom = new Bottom(tire);FrameWork frameWork = new FrameWork(bottom);Car car = new Car(frameWork);}

我们使用IoC的思想来写代码可以发现,当我们对Tire这个类进行修改的时候,只需要在创建Tire的时候传入参数就可以完成修改了,并不需要再像以前一样层层递归的修改代码。

通过IoC的思想我们让代码的耦合程度降低,让代码更加的灵活,让程序更加的简单了


说完了IoC,那么就来谈谈什么是Spring IoC

Spring IoC就是实现了具体IoC思想的框架,在这个Spring框架中存在一个IoC容器,通过这个容器我们可以存对象,也可以取对象。等同于说我们将对象的创建与销毁都交给了IoC容器来进行管理,同时在这个容器中既可以存对象也可以取对象!


那么什么是DI呢?DI全称“Dependency Injection”,翻译成中文是依赖注入

DI实际上就是对IoC思想的具体实现方式,我们通过依赖注入的方法,从Spring容器中取出对象,注入到对象中去!由于Spring IoC容器的存在,我们在存储对象的时候就将依赖关系交给Spring IoC容器来进行托管了,当我们创建对象并使用注入的方式,就可以自动的将该对象所依赖的对象注入到该对象中。这就是DI,实现了具体的IoC思想的行为!

举个例子

在传统的编程方式中,当类A依赖于类B时,我们通常会在创建A的实例时,手动创建B的实例并将其传递给A的构造函数或者通过其他方式设置依赖关系。这样的做法在小规模项目中可能没有问题,但随着项目规模的增大,依赖关系的管理将变得复杂而且容易出错。

而在DI(依赖注入)中,Spring IoC容器会负责管理所有的bean对象的创建和依赖关系。当创建A的实例时,Spring IoC容器会自动检查A所依赖的B是否已经在容器中创建,并将B的实例自动注入到A中,无需手动介入。

这种方式的好处在于:

  1. 解耦:类A不需要关心B是如何创建的,也不需要负责B的生命周期管理。
  2. 灵活性:如果需要更换B的实现,只需在配置文件中修改B的配置即可,而不需要修改A的代码。
  3. 可测试性:在测试时,可以轻松地将虚拟的B实例注入到A中,以便进行单元测试。

总之,DI通过将对象之间的依赖关系交由IoC容器来管理,使得代码更加清晰、易于维护,同时也提高了项目的灵活性和可测试性。

我们再以厨师做菜为例子

DI的过程如下:

  1. 厨子需要准备一道菜,而这道菜需要食材。
  2. 厨子并不直接去寻找或创建食材,而是通过向食材供应商(想象成IoC容器)请求所需的食材。
  3. 食材供应商根据厨子的请求,提供相应的食材,即便如此,食材的获取和管理都是由食材供应商来完成。
  4. 厨子接收到食材后,根据食谱,进行烹饪并最终完成了一道美味的菜品。

这个例子中,厨子(我们)就是应用程序的主体,而食材供应商(DI容器,如Spring IoC容器)则负责管理和提供依赖(食材)。厨子无需关心如何获取食材(依赖),只需要向供应商(容器)说明需要什么依赖,供应商会将所需的依赖注入到厨子中。

这就是为什么DI是实现了具体IoC思想的行为,因为我们的主体不再控制依赖了,而是通过注入的方式来实现依赖!

相关文章:

什么是IoC?什么是Spring IoC?什么是DI?

首先说明 IoC 是一种思想,IoC的全称是Inversion of Control,翻译成中文叫做“控制反转” 用人话来说,IoC的思想就是将一个对象对另一个对象的控制权交出去(不必关心交给谁),从而让对象之间的依赖关系降低&…...

分布式任务调度平台XXL-JOB学习笔记-helloworld运行

环境:win10 eclipse java17 mysql8.0.17 xxl-job 2.4 源码:https://github.com/xuxueli/xxl-job/ 导入时按Existing Maven Projects导入,先导入xxl-job-admin(管理平台)和xxl-job-executor-sample-springboot&#x…...

维护工程师提升设备管理水平的5个技巧

维护在工业工厂中扮演着至关重要的角色,而在这一关键领域,维护工程师发挥着关键作用。无论是混合还是离散自动化产线,设备的正常运行和保养对于确保生产的持续性至关重要。为了实现高效、成功的维护,维护工程师需要采取一系列方法…...

解码大众全新数字高尔夫8汽车CAN FD行驶功能电气架构

据在大众原厂的伙伴介绍,全新数字高尔夫8将在11月上市销售,目前高尔夫8在行驶功能电气架构上采用的CAN FD,在多媒体这一块采用的以太网,后续估计大部分类似同样MQBEvo平台的车型均会复制升级过来,那么,未来…...

什么是DDL、MDL?

DDL和MDL是与数据库相关的术语,它们有一些不同的含义。 DDL(Data Definition Language,数据定义语言): DDL用于定义和管理数据库中的对象,如表、索引、视图等。它包含用于创建、修改、删除和管理数据库对象…...

【sonar】安装sonarQube免费社区版9.9【Linux】【docker】

文章目录 ⛺sonarQube 镜像容器⛺Linux 安装镜像🍁出现 Permission denied的异常🍁安装sonarQube 中文包🍁重启服务 ⛺代码上传到sonarQube扫描🍁java语言配置🍁配置 JS TS Php Go Python⛏️出现异常sonar-scanner.ba…...

MySQL基本语法总结

创建数据库 create database 数据库名; -- 字符集要看mysql 版本, 5.7 Latin, 8.0 utf8 create database 数据库名 character set ‘utf8’;-- 指定数据库的字符集 create database IF NOT EXISTS 数据库名 character se…...

锐捷VSU技术理论与实验

目录 VSU涉及的相关基础概念 VSU的2种工作模式 VSU的3种设备角色 VSU的4种设备状态 VSU的分裂与合并 VSU建立过程 双主检测 VSU报文转发原理 VSU命令配置 配置VSU 配置双主检测 VSU涉及的相关基础概念 域编号(Domain ID) Domain ID是VSU的标…...

深入探索Linux文件链接技术:ln命令的妙用

当谈及 Linux 系统中的文件管理和链接技术,ln 命令是一个不可或缺的工具。ln 命令用于创建硬链接和软链接,它在 Linux 文件系统中发挥着重要作用,为用户提供了更大的灵活性和组织能力。在本文中,我们将深入探讨 ln 命令是什么&…...

electron项目开发环境搭建

由于最近需要做一款跨平台的桌面应用,所以选择使用electron来作为开发的框架,下面说一下如何搭建一个简单的electron项目: 一、准备工作 安装git:下载git | 官网 安装node:下载 | Node.js 中文网 安装npm/cnpm:npm …...

Spring 知识点

Spring 1.1 Spring 简介 1.1.1 Spring 概念 Spring是一个轻量级Java开发框架,最早有Rod Johnson创建为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题Spring最根本的使命是解决企业级应用开发的复杂性,即简化Java开发。使现有的技术更加容易使…...

目标跟踪与检测后进行 OpenCV 人脸识别 ,马赛克

文章大纲 简介模型下载地址ONNX 静态与动态 参数OpenCV 中支持的 人脸检测、识别Face detection 人脸检测YuNetFace recognition 人脸识别sFace目标检测,跟踪 后的人脸模糊问题汇总不支持动态输入的问题参考文献与学习路径简介 OpenCV 4.5.4版本收录了一个基于深度学习神经网…...

持有PMP证书,可申请CSPM证书!

一,CSPM介绍 CSPM的全称是:项目管理专业人员能力评价,是我们国内的“PMP”,是我们中国人自己的项目管理专业人士评价指南,符合中国国情且符合中国未来发展的项目管理专业人员能力评价标准。 2022年10月12日发布实施了…...

linux自定义网络访问规则

1.更改防火墙默认区域为trusted firewall-cmd --set-default-zonetrusted 2.新建一个zone,将想要访问本机80端口的ip,如:192.168.3.99 ,添加的这个zone中,同时在这个zone中放行80端口。 firewall-cmd --permanent --ne…...

247 个经典实用有趣的 Python 实例附源码

今天给大家整理了 247 个经典实用有趣的 Python 实例,185 页代码齐全可复制 pdf,几乎涵盖了 Python 各个方面的知识点,即可以帮助小白快速全面的学习 Python,也可以让老手通过实战练习来查缺补漏。 福利:文末有chat-g…...

动手学深度学习Pytorch 4.4练习

1.这个多项式回归问题可以准确地解出吗?提⽰:使⽤线性代数。 可以,把多项式问题,用matlab的str2sym表示出来,再用solve求解。 2.考虑多项式的模型选择。 1. 绘制训练损失与模型复杂度(多项式的阶数)的关系…...

【计算机视觉 | Kaggle】飞机凝结轨迹识别 Baseline 分享和解读(含源代码)

文章目录 一、导读二、比赛背景三、比赛任务四、比赛数据五、评价指标六、Baseline6.1 Training part6.2 Submission part 一、导读 比赛名称:Google Research - Identify Contrails to Reduce Global Warming https://www.kaggle.com/competitions/google-researc…...

ThinkPHP文件上传:简便安全的解决方案

在现代Web应用程序中,文件上传是一项常见而重要的功能。ThinkPHP是一种流行的PHP开发框架,提供了便捷而安全的文件上传解决方案。本文将介绍ThinkPHP框架中的文件上传功能,并探讨如何使用它来实现安全可靠的文件上传功能。 一、ThinkPHP文件…...

torch.multiprocessing

文章目录 张量共享torch.multiprocessing.spawnmultiprocessing.Pool与torch.multiprocessing.Pool阻塞非阻塞map阻塞非阻塞 starmap torch.multiprocessing是具有额外功能的multiprocessing,其 API 与multiprocessing完全兼容,因此我们可以将其用作直接…...

解决本地代码commit后发现远程分支被更新的烦恼!

解决本地代码commit后远程分支更新的烦恼! 在进行代码开发过程中,当我们准备将本地代码推送到远程分支时,有时会遇到远程分支已经被更新的情况。这给我们的开发工作带来了一些挑战,因为我们需要确保我们的修改与远程分支的更新保持…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理&#xff1a…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

ESP32读取DHT11温湿度数据

芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...