什么是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后远程分支更新的烦恼! 在进行代码开发过程中,当我们准备将本地代码推送到远程分支时,有时会遇到远程分支已经被更新的情况。这给我们的开发工作带来了一些挑战,因为我们需要确保我们的修改与远程分支的更新保持…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
