Spring概述及IoC,DI的理解

news2025/1/12 16:15:54

目录

一、Spring 是什么?

1.1 什么是容器?

1.2 如何理解IoC?

1.3 理解Spring Ioc

1.4 DI是什么

1.5 回顾IoC,DI

1.6 IoC和DI的对比


一、Spring 是什么?

我们通常所说的 Spring 指的是 Spring Framework(Spring 框架),它是⼀个开源框架,有着活跃而庞大的社区,这就是它之所以能长久不衰的原因。Spring 支持广泛的应用场景,它可以让 Java 企业级的 应用程序开发起来更简单。

⽤⼀句话概括 Spring:Spring 是包含了众多⼯具⽅法的 IoC 容器。也就是说Spring最核心的功能就是容器管理。

1.1 什么是容器?

容器是用来容纳某种物品的基本装置。就好比Map与List属于数据存储的容器,Tomcat属于Web容器,同理,作为IoC容器的Spring,它包含了许多方法和工具。

1.2 如何理解IoC?

IoC的英文全称为:Inversion of Control 翻译成中文为 ”控制反转“的意思。它的核心思想是将程序的控制权从调用者转移到被调用者的组件或者框架中,从而实现框架的解耦和可扩展性。

代码举例 

这里我们以汽车为例:它包含车身,底盘,轮胎等。我们造一辆汽车时,需要有车身,而车身需要有轮胎,对传统程序开发来说:造车的时候需要车身,于是就new一个车身,而车身需要底座,于是就new一个底座,同理,就new一个轮胎。

像Car类与Framework类这种的依赖关系在日常开发中也是常见的,比如前后端分离模式下的前端代码的实现,也是需要依赖于后端的所提供的一些接口的,如果仅只有前端,那么数据将无法持久化的保存。

Car类:

public class Car {
    private Framework framework;
    //既然车是依赖于车架的,所以我们需要在构造方法中new它。
    public Car() {
        framework = new Framework();
    }
    public void init() {
        System.out.println("do car");

        framework.init();
    }
    public static void main(String[] args) {
        Car car = new Car();
        car.init();
    }
}

Framework类:

public class Framework {
    private Bottom bottom;
    public Framework() {
        bottom = new Bottom();
    }
    public void init() {
        System.out.println("do framework");
        bottom.init();
    }
}

Bottom类:

public class Bottom {
    private Tire tire;
    public Bottom() {
        tire = new Tire();
    }
    public void init() {
        System.out.println("do bottom");
        tire.init();
    }
}

Tire类:

public class Tire {
    private int size = 18;

    public void init() {
        System.out.println("size = " + size);
    }
}

代码运行结果:

 传统程序开发缺陷

以上程序中,轮胎的尺寸是固定的,这显然并不符合日常生活的逻辑,因为人们的需求是多种多样的。于是我们需要将其进行修改(可以传递轮胎的尺寸):

从以上代码可以看出,当底层的代码改动之后,整个调用链上的所有代码都需要进行修改(如果在Bottom中的):

虽然这时候可以满足需求:

但是需要对整个调用链上的所有代码进行修改,显然不合适。

 解决传统开发中的缺陷

为了解决这一缺陷,我们可以根据IoC的思想,将控制权交出去,换句话说,需要轮胎Tire类时,

你给我传一个Tire对象,我不去new一个Tire对象了,这一的话,就算Tire类加参数也只需要修改Tire类的构造方法与相关执行方法,属性等,这就很好的降低了耦合度,起到了解耦的作用。

这种将一个对象所需要的依赖关系从对象本身中抽离出来,交给外部容器来管理和注入的方式交做依赖注入。

改动后的代码:

在传统的代码中对象创建顺序是:Car -> Framework -> Bottom -> Tire
改进之后解耦的代码的对象创建顺序是:Tire -> Bottom -> Framework -> Car

于是可以得到IoC有以下优点:

对象(bean)的生命周期交给其他(一般为Spring)来维护,作为程序员,无需关注(对象的创建和销毁时机),这些工作都交给Spring来完成。

1.3 理解Spring Ioc

既然 Spring 是⼀个 IoC(控制反转)容器,重点还在“容器”⼆字上,那么它就具备两个最基础的功
能:

  • 将对象存⼊到容器
  • 从容器中取出对象

Spring是一个IoC容器,意思其实是将对象的创建和销毁的权利交给Spring来管理,而本身又具备存储对象和获取对象的能力。

根据以上:我们可以得出Spring IoC的优点如下,

  1. 简化代码:Spring IoC 可以帮助我们自动管理对象的创建和依赖注入,从而简化了代码,减少了不必要的重复代码和样板代码。

  2. 降低耦合性:Spring IoC 可以将组件之间的依赖关系解耦,从而提高了代码的可维护性和可扩展性,使得程序更加灵活和适应变化。

1.4 DI是什么

DI 是 Dependency Injection 的缩写,翻译成中⽂是“依赖注⼊”的意思。

所谓的依赖注入,就是由IoC容器在运行期间,动态的将某种依赖关系注入到对象之中。所以,依赖注入(DI)和控制反转(IoC)是从不同的角度描述同一件事情。

举个例子:

在开发的过程中,DI主要体现在prom.xml的引入依赖中:

1.5 回顾IoC,DI

IoC全称Inversion of Control,把创建对象的权力交给容器,对象的实例不是由调用者来创建,而是由容器来创建,容器会负责控制程序之间的关系,而不是由调用者的程序代码来控制。这样,控制权由应用代码转移到了容器,控制权发生了反转,这就是控制反转,它是Spring框架的核心思想之一。

DI全称Dependecy injection ,当某个Java实例需要另一个java实例时,创建被调用者的工作不是由调用者实现,而是由Spring容器来完成,然后注入到调用者之中,因此称为依赖注入。

1.6 IoC和DI的对比

IoC和DI其实是从不同的角度来描述同一概念,IoC是一种思想,而思想是需要一个方案来落实的,DI就是这个方案。
 


 

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

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

相关文章

不会写代码也能做自动化?推荐一款自动化测试神器

在软件测试这条道路上,大部分的职业技能发展道路都会是纯业务手工测试→自动化测试→性能测试→安全测试/测试开发。 但是却有着一部分人起初进入软件测试这一行看重的就是软件测试属于IT行业,门槛比较低,不需要代码基础。 这就导致了这一部…

数据库系列之MySQL线程ID和操作系统线程ID对应关系

在日常运维工作中,MySQL数据库服务器出现SQL语句执行导致服务器CPU使用率突增,如何通过现有手段快速定位排查到哪个SQL语句,并采取应急措施。本文介绍基于传统的操作系统线程的CPU使用监控手段入手,利用操作系统线程ID和MySQL线程…

Leetcode.1631 最小体力消耗路径

题目链接 Leetcode.1631 最小体力消耗路径 Rating : 1948 题目描述 你准备参加一场远足活动。给你一个二维 rows x columns的地图 heights,其中 heights[row][col]表示格子 (row,col)(row, col)(row,col) 的高度。一开始你在最左上角的格子 (0,0)(0, 0)…

8.Java面向对象---类、属性和方法

Java面向对象—类、属性和方法 在生活中,说到类,可以联想到类别,同类,会想到一类人,一类事物等等。而这一类人或事物都是具有相同特征或特点和行为的,我们根据不同的特征或特点和行为将他们归类或分类。同…

ActiveReportsJS 4.0 FIX ActiveReportsJS 4.0 Crack

JavaScript 报告工具是一组用于数据整合和可视化的 Web 组件。ActiveReportsJS 是前端开发人员用来在 Web 应用程序中嵌入报告的解决方案。报表设计器和查看器组件、强大的数据可视化器和丰富的 API 等主要功能使 ActiveReportsJS 成为行业领导者。 JavaScript 报告引擎 利用强…

【算法与数据结构】2 梅开二度,线性查找的究极优化

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 本文收录于算法与数据结构体系专栏,本专栏对于0基础者极为友好,欢迎与我一起完成算法与数据结构的从0到1的跨越 线性查找的究极优化1.前言2.泛型1.1粗略介绍泛型类1.2使用泛型方法1…

Python 中如果键不存在,则将键添加到字典

文章目录使用 not in 检查键是否存在如果字典不存在则使用 dict.get() 添加键到字典如果字典不存在,则使用 setdefault() 将键添加到字典中使用 not in 检查键是否存在 如果字典不存在,则将键添加到字典中: 使用 not in 运算符检查键是否不…

如何用ChatGPT写文章?只需要这3步,10倍提升写作效率

随着技术的不断进步和创新,我们的生活方式和工作方式也在不断变化。在日常工作中,越来越多的人使用人工智能和机器学习等技术提高效率减少时间成本。最近ChatGPT火出圈了,很多人通过使用ChatGPT提高了工作效率。那么,在写作领域&a…

【LeetCode】剑指 Offer 54. 二叉搜索树的第k大节点 p269 -- Java Version

题目链接:https://leetcode.cn/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/ 1. 题目介绍( 54. 二叉搜索树的第k大节点) 给定一棵二叉搜索树,请找出其中第 k 大的节点的值。 【测试用例】: 示例 1: 示例2&…

UTONMOS:打造你的梦想,开启元宇宙无限彩排的游戏时代

有人认为,元宇宙不过是 VR 概念的“旧瓶换新酒式”的炒作。 有人认为,元宇宙是被资本和巨头绑架的另一场“游戏”。 有人认为,元宇宙是骗局,是智商税。 更多人对元宇宙的评价是“呵呵”。 媒体朋友对元宇宙的描述更具艺术性&a…

详解FreeRTOS中的软件定时器

软件定时器用于让某个任务定时执行,或者周期性执行。比如设定某个时间后执行某个函数,或者每隔一段时间执行某个函数。由软件定时器执行的函数称为软件定时器的回调函数。 参考资料: 《Mastering the FreeRTOS™ Real Time Kernel》——Cha…

vue2、vue3使用i18n实现国际化

一、目标效果 源码地址:git clone i18n-demo: vue2、vue3实现i18n国际化功能 默认语言是中文: 点击语言切换,变成英文(这里简单设置了中文、英文两种语言) 注意:vue2支持 vue-i18n 版本8.0 ,vu…

本轮沙尘已跨过长江!这些地区请注意加强防范

气象台4月12日06时继续发布沙尘暴蓝色预警:受冷空气大风影响,预计4月12日08时至13日08时,新疆南疆盆地和东部、内蒙古中西部、甘肃河西和中部、宁夏、陕西中部、山西、河北、辽宁、北京、天津、山东、河南、安徽、江苏、上海、湖北中北部、浙…

漏洞利用之弱口令

漏洞利用之弱口令1.弱口令的定义2.弱口令字典生成收集用户信息,组成爆破字典特殊字符增强的字典生成字典生成项目3.利用 Burp Suite 进行密码爆破1.弱口令的定义 弱口令没有严格和准确的定义,通常认为容易被别人猜测到或被破解工具破解的口令均为弱口令…

【Mysql】mysql8.0.26解压包部署方式

版本背景: 操作系统:centos7.3 mysql版本:mysql-8.0.26-linux-glibc2.12-x86_64.tar 一、前期准备 1、检测操作系统自带安装的mysql和mariadb服务,如存在,需卸载 rpm -qa | grep mysql rpm -qa | grep mariadb 卸载…

vim编辑器使用

目录 vim基本概念 vim基本操作 插入模式 命令模式 移动光标 删除字符 复制剪切 替换 撤销 更改 移动指定行 底行模式 命令集 vim简单配置 vim基本概念 vim编辑器有三种模式: 命令模式:光标移动,字符或行移动&#x…

iTOP-RK3568开发板Android kernel移植-单独编译内核

此方法常用于 kernel 的开发和调试,以下的方法既编译 kernel 部分时, 同 时打包成 boot.img, 这样加快了我们开发的速度; 进入内核目录下, 输入以下命令: cd kernel make ARCHarm64 CC../prebuilts/cla…

Vue:axios

1、 第三方库方式, 基于 Promise 的 HTTP 库:axios (对 XMLHttpRequest进行的封装) 即: axios.get().then() 2、跨域访问 定义:在 a 页面中想获取 b 页面中的资源,如果 a 页面和 b 页面所处的协…

Java基础从入门到精通系列(一)

1、Java简介 Java语言是一种高级、并发、面向对象的计算机编程语言,由Sun Microsystems公司于1995年推出。Java广泛应用于Web应用程序开发、移动应用程序开发以及大型企业级应用程序的开发中。Java语言具有跨平台、安全性好、可移植性强、易学易用等优点&#xff0…

JavaSE学习进阶day04_01 Date类

第一章 Date类 首先对时间的几个补充有必要知道: 时间起点: 心得: 如果以后我们仅仅要展示时间,那么可以用Date和SimpleDateFormat(格式化) 如果我们要拿着两个时间进行计算,用Date和SimpleD…