什么是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中,无需手动介入。
这种方式的好处在于:
- 解耦:类A不需要关心B是如何创建的,也不需要负责B的生命周期管理。
- 灵活性:如果需要更换B的实现,只需在配置文件中修改B的配置即可,而不需要修改A的代码。
- 可测试性:在测试时,可以轻松地将虚拟的B实例注入到A中,以便进行单元测试。
总之,DI通过将对象之间的依赖关系交由IoC容器来管理,使得代码更加清晰、易于维护,同时也提高了项目的灵活性和可测试性。
我们再以厨师做菜为例子
DI的过程如下:
- 厨子需要准备一道菜,而这道菜需要食材。
- 厨子并不直接去寻找或创建食材,而是通过向食材供应商(想象成IoC容器)请求所需的食材。
- 食材供应商根据厨子的请求,提供相应的食材,即便如此,食材的获取和管理都是由食材供应商来完成。
- 厨子接收到食材后,根据食谱,进行烹饪并最终完成了一道美味的菜品。
这个例子中,厨子(我们)就是应用程序的主体,而食材供应商(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后远程分支更新的烦恼! 在进行代码开发过程中,当我们准备将本地代码推送到远程分支时,有时会遇到远程分支已经被更新的情况。这给我们的开发工作带来了一些挑战,因为我们需要确保我们的修改与远程分支的更新保持…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...