Spring 是什么?IoC 和 DI的区别

  • 1. Spring 是什么?
    • 2. IoC是什么?
  • 2.DI概念说明

1. Spring 是什么?

我们通常讲的Spring指的是Spring Framework(Spring框架),它是一个开源的框架,有着活跃而庞大的社区,这也是它之所谓经久不衰的原因。官方的解读是:Spring官网

在这里插入图片描述

翻译过来就是:Spring使Java编程对每个人来说更快、更容易、更安全。Spring对速度、简单性和生产力的关注使它成为全球最受欢迎Java框架。

用一句话概括Spring:包含了众多工具方法的IoC容器,也就是说Spring最核心的功能就是容器管理 。 这句话大抵有两个方面需要解读,一是IoC,二是容器。

  1. 容器是什么?

    容器就是用来存储物品的一个装置,可以存,也可以取。

2. IoC是什么?

IoC = Inversion of Control (控制反转),首先IoC是一种思想,再就是说Spring是一个包含了众多工具方法的**“控制反转”的容器**。它具备两个最基础的功能:1.把对象存入容器;2.把对象取出容器。

通过一个典型且普通的Java代码案例试着理解:(此处没有使用Maven)

约定:创建一个车类,造车必须先要有车身,造车身必须先要有底盘,造底盘必须先要有轮胎。(别问为什么,天道法则,就当这是个游戏规则)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uAnJbiBk-1686298172612)(C:\Users\COFFEEWEN\AppData\Roaming\Typora\typora-user-images\image-20230609145003516.png)]

构建一个车,车需要依赖车身,车身需要依赖底盘,底盘依赖轮胎。最终代码如下:

  1. 车类
public class Car {public void init(){//构造Bottom类,因为车身类需要依赖于车身类Framework framework = new Framework();framework.init();System.out.println("do Car");}
}
  1. 车身类
public class Framework {public void init(){//构造Bottom类,因为车身类需要依赖于底盘类Bottom bottom = new Bottom();bottom.init();System.out.println("do Framework");}
}
  1. 底盘类
public class Bottom {public void init(){//构造tire类,因为车身类需要依赖于轮胎类Tire tire = new Tire();tire.init();System.out.println("do Bottom");}
}

4.轮胎类

public class Tire {private  int size = 17;//轮胎尺寸public void init(){System.out.println("do Tire size = "+size);}
}
  1. 测试类
public class Test {public static void main(String[] args) {Car car = new Car();car.init();}
}
  1. 运行结果(造车成功)

在这里插入图片描述

上述代码:当前类控制着下级类的生命周期,并且有一个缺陷就是一旦最底层的代码改动后,整个调用链都需要跟着改动,比如在Tire类的init()方法增加一个形参,那么整个调用链都需要增加一个形参,这样每个类的耦合性太高,我们可以试着将原来当前类自己创建下级类的方法,改为传递的方式(注入的方式),因此最底层类发生变化,当前类也不需要修改代码.这样就完成了解耦。(好的代码要高内聚,低耦合)
在这里插入图片描述

  1. 车类
public class Car {Framework framework;public Car(Framework framework){this.framework = framework;}public void init(){System.out.println("do Car");framework.init();}
}
  1. 车身类
public class Framework {Bottom bottom;public Framework(Bottom bottom){this.bottom = bottom;}public void init(){System.out.println("do Framework");bottom.init();}
}
  1. 底盘类
public class Bottom {Tire tire ;public Bottom(Tire tire){this.tire = tire;}public void init(){System.out.println("do Bottom");tire.init();}
}
  1. 轮胎类
public class Tire {private int size = 17;//此时增加 size参数,就不需要改动上层代码public Tire(int size){this.size = size;}public void init(){System.out.println("do Tire size = "+size);}
}
  1. 测试类
public class Test {public static void main(String[] args) {//此时修改 size参数,就不需要改动上层代码Tire tire = new Tire(20);Bottom bottom = new Bottom(tire);Framework framework = new Framework(bottom);Car car = new Car(framework);car.init();}
}

这就是控制反转式的开发,通过以上调整,最底层代码改动,整个调用链不需要做任何改变,这样就完成了代码之间的解耦,从而更加灵活,通用了。下层类的生命也就交给了第三方实现,不再是当前类控制着下层类的生命周期。因此可以得出IoC核心功能之一是解耦

我们发现一个很明显的现象:传统的代码和改进后的代码,创建类的顺序是相反的;传统代码Car类创建Framework对象,Framwork类创建Bottom对象依次往下。改进后“控制权”便发生了反转,不再是上级类控制下级对象了,而是把下级对象注入到当前类中,而对象的创建和销毁则交给了第三方实现,把对象存入第三方,用时就去取对象。这就是典型的**“控制反转”,也就是IoC的实现思想再回头思考Spring是什么?它是一个IoC容器,意思是把对象的创建和销毁的权利交给了Spring管理,它本身具备了存储对象和获取对象的能力.**

2.DI概念说明

说到IoC就逃不过DI,首先DI是Dependency Injection的缩写,翻译过来就是"依赖注入"的意思。所谓“依赖注入”的意思是:在框架运行时,动态的把某个对象动态的拿到(注入)当前类中。官方点的话,当某个java 实例需要另一个java实例时,创建被调用者的工作不是由调用者实现,而是由spring容器来完成,然后注入调用者,因此称为依赖注入。(此处Spring容器就可以理解为第三方)

“IoC”是一种思想,而“DI”则是思想的具体实现。

就是"依赖注入"的意思。所谓“依赖注入”的意思是:在框架运行时,动态的把某个对象动态的拿到(注入)当前类中。官方点的话,当某个java 实例需要另一个java实例时,创建被调用者的工作不是由调用者实现,而是由spring容器来完成,然后注入调用者,因此称为依赖注入。(此处Spring容器就可以理解为第三方)

上述代码在测试类中创建每个对象(把控制权交给了测试类),因此Car类需要用Framework对象时,只需要动态的把Framework对象注入到Car类就可以了。
DI和IoC是从不同角度做同一件事的(解耦),IoC是把控制权交给spring,用还是要用的;DI是把依赖的对象交给别人,需要用时动态的去取。两者都有共同的特点:更简单,更高效,更解耦

“IoC”是一种思想,而“DI”则是思想的具体实现。
比如我今天打算去欢乐谷玩,这是一种思想,乘坐地铁或是出租车到达欢乐谷,这是具体的实现。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React03-props 和 state 详解

一、props 组件传参 1. props 基本使用 我们在使用组件时可以向组件传递数据&#xff0c;在组件内可以使用 props 对象来调用传入的数据。 function Person(props) {return <div><h3>姓名&#xff1a;{props.name}</h3><h3>年龄&#xff1a;{props.…

接口测试-postman,JMeter与LoadRunner比较

目录 JMeter与LoadRunner比较 JMeter缺点 一.创建测试用例集、子集 二.创建测试用例 三.设置变量 四.添加响应处理 五.批量执行测试用例 总结&#xff1a; postman是一个谷歌出的轻量级的专门测试接口的小工具~&#xff08;PS&#xff1a;postman包括两种&#xff1a;C…

【项目部署】NGINX原生部署前端

如有拼错的单词感谢提醒~ 一.准备工作 为了方便文件的管理&#xff0c;我们先在服务器上创建一个专门存放项目的目录。 # 1.查看当前所在目录 pwd # 1.1 可以切换到根目录管理 cd /root # 2.创建一个专门存放项目的文件夹 mkdir services # 3.可以查看我们创建的文件夹 ls # …

【精致的美少女-InsCode Stable Diffusion 美图活动一期】

&#x1f4a7; 【精致的美少女 − I n s C o d e S t a b l e D i f f u s i o n 美图活动一期】 \color{#FF1493}{【精致的美少女-InsCode Stable Diffusion 美图活动一期】} 【精致的美少女−InsCodeStableDiffusion美图活动一期】&#x1f4a7; &#x1f337; 仰望…

Abaqus_Python 基于abqpy的python3版本的二次开发【没写完,慢慢更新】

前言 介绍abaqus和python二次开发的教程较少&#xff0c;而比较常见的一种python二次开发方法是&#xff1a;使用PythonReader.exe去读取Abaqus运行后的内部生成代码&#xff08;即对应temp目录下的abaqus.rpy&#xff0c;例如“Abaqus\temp\abaqus.rpy”&#xff09;再粘贴到…

【Linux】Selinux基本了解

文章目录 SElinux1.简介2.基本概念3.规则4.策略5.工作模式 SElinux 1.简介 SELinux是一个内核级别的安全机制&#xff0c;从Linux2.6内核之后就将SELinux集成在了内核当中。因为SELinux是内核级别的&#xff0c;所以我们对于其配置文件的修改都是需要重新启动操作系统才能生效…

小狐狸ChatGPT付费创作系统V2.1.0独立版 +WEB端+ H5端 + 小程序端安装教程

播播资源针对ChatGPT付费创作系统V2.1.0提供最新的对应版本小程序端全套测试&#xff0c;上一版本增加了PC端绘画功能&#xff0c;绘画功能采用其他绘画接口-意间AI&#xff0c;本版新增了百度文心一言接口。后台一些小细节的优化及一些小BUG的处理&#xff0c;前端进行了些小细…

【运维知识进阶篇】zabbix5.0稳定版详解6(zabbix自动化监控:自动发现+自动注册+监控项目主动式)

本篇文章继续给大家介绍zabbix自动化监控&#xff0c;包括zabbix自动注册&#xff0c;zabbix自动发现&#xff0c;将主机添加进服务端之后需要做的监控项目更改为主动式&#xff0c;zabbix说多不多&#xff0c;说少不少&#xff0c;其实远没有监控那么简单&#xff0c;更深层次…

【实证分析】地区竞争、推广数字普惠金融与绿色经济效率

研究内容 基于考虑非期望产出的 Super-SBM 模型测算了 2011—2018 年中国 265 个地级市的绿色经济效率,综合运用面板模型、空间杜宾模型,系统分析了地区竞争下推广数字普惠金融对绿色经济效率的影响效应。研究发现:(1)绿色经济效率存在显著正向空间溢出效应,地理距离与经济差异…

部署LVS-DR群集博客

文章目录 部署LVS-DR群集一.LVS数据包流向分析1.数据包流向2.DR 模式的特点 二.LVS-DR中ARP的问题1.问题11.1 解决办法 2.问题22.1 解决办法 三.LVS-DR特性1.LVS-DR模式需要注意2.优点3.缺点 四.案例&#xff0c;构建LVS-DR集群部署1.LVS-DR集群构架图2.DR模式 LVS负载均衡群集…

测试Hyperledger Fabric环境

首先进入fabric-samples目录中的first-networked 子目录 cd fabric-samples/first-network 在first-network目录下有一个自动化脚本byfn.sh,可以使用-help参数查看相应的可 用命令&#xff0c;在命令提示符中输入如下命令&#xff1a; ./byfn.sh --help命令执行成功后&#…

短视频矩阵系统源码自研+开发技术文档

一、短视频矩阵系统源码自研&#xff08;站在开发者交付分析&#xff09; 目录 一、短视频矩阵系统源码自研&#xff08;站在开发者交付分析&#xff09; 二、 短视频矩阵系统需要开发的前提语言框架技巧&#xff1a;NGINX&#xff0c;PHP7.4&#xff0c;MySQL5.7&#xff0…