Spring 是什么?IoC 和 DI的区别

news2024/11/25 4:45:29

  • 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.coloradmin.cn/o/627924.html

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

相关文章

学会这5个步骤,就能轻轻松松地获取代码覆盖率报告

目录 前言: 1、创建main函数的test文件 2、插桩方式编译源码 3、运行主服务 4、执行测试用例 5、优雅退出主服务,并生成覆盖率报告 前言: 代码覆盖率报告可以帮助我们了解测试用例的质量和覆盖程度。 小编前期所测项目多为go语言研发&…

《C++高级编程》读书笔记(一:C++和标准库速成)

1、参考引用 C高级编程(第4版,C17标准)马克葛瑞格尔 2、建议先看《21天学通C》 这本书入门,笔记链接如下 21天学通C读书笔记(文章链接汇总) 1. C 基础知识 1.1 小程序 “hello world” // helloworld.cpp…

开源项目合集......

likeshop开源商城系统,公众号商城、H5商城、微信小程序商城、抖音小程序商城、字节小程序商城、头条小程序商城、安卓App商城、苹果App商城代码全开源,免费商用。 适用场景:B2C商城、新零售商城、社交电商商城、分销系统商城、小程序商城、商…

循环链表的创建

循环链表的介绍及创建(C语言代码实现) 点击打开在线编译器,边学边练 循环链表概念 对于单链表以及双向链表,其就像一个小巷,无论怎么样最终都能从一端走到另一端,然而循环链表则像一个有传送门的小巷&…

力扣 912. 排序数组

文章目录 一、题目描述二、题解1.快速排序2.堆排序3.二路归并排序 一、题目描述 给你一个整数数组 nums,请你将该数组升序排列。 示例 1: 输入:nums [5,2,3,1] 输出:[1,2,3,5]示例 2: 输入:nums [5,1,1…

精细消费 年轻人和父母的奇妙交汇

日本社会学家三浦展结合对日本“311”大地震后的社会观察,提出了“第四消费时代”,即人们在经历了消费社会充分的发展过程之后,社会上逐渐兴起了低欲望、乐于共享、重视环保的消费理念。 在当时,主流观点普遍认为中国还处于大众化…

JWT单点登录

单点登录 文章目录 单点登录零、用户模块内容以及设计一、问题的提出二、单点登录SSO1.1 什么是单点登录1.2 单点登录的技术实现机制 二、远程调用方式RPC三、JWT的使用3.1 session的使用原理3.2 JWT介绍3.3 JWT原理3.4 JWT的使用 四、CAS实现单点登录的原理四、CAS的安装和代码…

十二、进程间通信

目录 目录 零、前置知识 一、什么是进程间通信 (一)含义 (二)发展 (三)类型 1.管道 2.System V IPC 3.POSIX IPC 二、为什么要有进程间通信 三、怎么进行进程间通信 (一)…

Snipaste工具推荐

Snipaste Snipaste 不只是截图,善用贴图功能将帮助你提升工作效率! 新用户? 截图默认为 F1,贴图为 F3,然后请对照着 快捷键列表 按一遍,体会它们的用法,就入门啦! 遇到了麻烦&…

Java通过Ip2region实现IP定位

我们在一些短视频平台上可以看到,视频作者或评论区可以显示IP地址,这其实就是根据IP获取到的我们可以通过一些在线网站就可以看到我们当前的公网IP和IP定位,最近有个需求也需要通过请求获取客户端的IP和IP的定位,于是通过一系列的百度,最终选择使用Ip2region这个工具库来进行定…

flutter的自定义系列雷达图

自定义是flutter进阶中不可缺少的ui层知识点,这里我们来总结下: 在Flutter中,自定义绘制通常是通过使用CustomPaint和CustomPainter来实现的。 创建CustomPaint组件 首先,需要创建一个CustomPaint组件。CustomPaint是一个Widge…

MobPush 厂商通道申请指南

华为厂商申请 创建应用 登录华为开发者联盟,注册您的应用,在应用信息中获取APP ID和Client Secret 配置SHA256证书指纹 在华为开发者联盟配置SHA256证书指纹。获取及配置请参见华为官方文档配置AppGallery Connect 设置消息回执 集成华为厂商通道SDK…

带你了解二进制

目录 视频参考: 讲解:​编辑 运算: 1001(二进制) 9(十位数)1111(二进制) 15(十位数)11001(二进制) 25(…

第二章 搭建TS环境

搭建 TypeScript 的开发环境。一个舒适、便捷且顺手的开发环境,不仅能大大提高学习效率,也会对我们日常的开发工作有很大帮助。 这一节我们就来介绍 VS Code 下的 TypeScript 环境搭建:插件以及配置项。对于 TS 文件的执行,我们会…

设计模式(十):结构型之外观模式

设计模式系列文章 设计模式(一):创建型之单例模式 设计模式(二、三):创建型之工厂方法和抽象工厂模式 设计模式(四):创建型之原型模式 设计模式(五):创建型之建造者模式 设计模式(六):结构型之代理模式 设计模式…

备战2月面试8家大厂,成功上岸字节(Java岗)定级T2-2,分享一下我的面试心得

最近在公众号上看到一位道友的字节面经,可以说是深有感触了! 他的背景是杭州某中厂的Java后端开发,本科毕业5年,最近2个月面试了PDD、小红书、字节等多个大厂。几乎都拿到了Offer,最终选择了字节2-2。以下是他的一些分…

Navicat对postgresql导入导出的坑

Navicat导出postgresql中的表,再新建数据库导入时通常会报错,往往是因为自增id导致的 可以看到,再次导入时会报错! 解决办法如下: 解决办法: 重新导入,并执行以下命令:&#xff08…

Python从入门到精通_第0讲_Python的学习路线整理

写在最前: 为什么开这个专栏: 之前我做过一个专栏,专门介绍Python爬虫技术,这一专栏收获了很多朋友们的点赞收藏和关注。但是在爬虫技术专栏中,对于Python语言本身的讲解并不是很细致,由于Python在爬虫、数…

Unity 安装 wwise

先下载 https://www.audiokinetic.com/zh/download 安装的时候要选sdk 就是20g的那个 然后运行 选择unity 可以看到这个界面 好,现在开始要安装离线包 直接项目里点 第二个 装好后 他会提示你 无法找到unity安装的地址 1 打开你的 unity 编辑器 2 在unity安装的…

CorelDRAW矢量绘图2023中文版下载

市面上的矢量绘图工具虽然很多,但权威又专业的却不多,选到不好用的工具,会极大的影响自己创作,CorelDRAW简称cdr,是一款功能强大的矢量图制作软件,一说到矢量图制作,大家都会不由自主地想到cdr。…