2023.10.31 关于 Spring 的基本概念

news2025/1/20 22:02:52

目录

Spring

 容器 

对象生命周期

 IoC 

Spring IoC 

DI


Spring

  • Spring 的全称为 Spring Framework,是一个开源的 Java 应用程序框架
  • 它提供了一种综合的编程和配置模型,用于构建现代化企业级的应用程序

一句话概括

  • Spring 是包含了众多工具方法的 IoC 容器

 容器 

  •  容器就是用来容纳某种物品的基本装置

实例理解

  • 水杯 -> 用来装水的容器
  • List/Map -> 数据存储容器
  • Tomcat -> Web容器

对象生命周期

  • 分为三个阶段

创建阶段

  • 对象被实例化并分配内存空间
  • 可以通过 关键字 new、工厂方法、依赖注入等方式来完成
  • 创建阶段,对象可能需要进行一些初始化操作,例如设置默认值、加载配置等

使用阶段

  • 对象被创建后,它可以被应用程序代码使用
  • 使用阶段,对象执行它所具有的功能、处理业务逻辑等
  • 对象可能会被传递给其他对象,作为依赖项被引用和调用

销毁阶段

  • 当对象不再需要时,需要进行销毁操作以释放占用的资源
  • 销毁阶段,包括清零资源、关闭连接、保存状态等操作
  • 对象的销毁可以由垃圾回收器自动处理,或者通过显式的销毁方法来触发

 IoC 

  • IoC 的全称为 Inversion of Control 译为 控制反转
  • 即 Spring 是一个 控制反转 的容器

基本概念

  • 控制反转 是一种软件设计原则,它指的是将对象的创建、依赖关系的管理、对象的生命周期的控制权从应用程序代码转移到一个外部容器或框架中
  • 此处的 外部容器就是 Spring 容器
  • 下图是 传统方式 和 控制反转方式 对比

  • 相比于控制反转,传统方式 对象的创建 和 依赖关系的管理都留给了应用程序代码

实例理解

  • 我们规定造车的依赖关系:一台完整的车 -> 车身 -> 底盘 -> 轮胎

传统方式

// 轮胎
public class Tire {
//    轮毂大小
    private int size = 17;

    public void init() {
        System.out.println("轮毂的 size 为 ——>  " + size);
    }
}
// 底盘
public class Bottom {
    private Tire tire;

//    此处控制了 tire 对象的生命周期
    public Bottom() {
        tire = new Tire();
    }
    public void init() {
        System.out.println("do Bottom");
//        装上轮胎
        tire.init();
    }
}
//车身
public class Framework {
    private Bottom bottom;

//    此处控制了 bottom 对象的生命周期
    public Framework() {
        bottom = new Bottom();
    }
    public void init() {
        System.out.println("do framework");
//        装上含轮胎的底盘
        bottom.init();
    }
}
//一台完整的车
public class Car {
    private Framework framework;
    
//    此处控制了 framework 对象的生命周期
    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();
    }
}
  • 我们观察上述代码,其存在强依赖关系
  • 假设不同客户需要定制不同车轮毂尺寸,那么我们便需要修改当前代码

  • 上图绿框便是需要修改和添加的代码逻辑

  • 与此同时也反应了传统方式的缺点

传统方式的缺点

  • 当最底层发生变化时,即 Tire类 发生变化,整个调用链都需要修改,也就是具有高耦合的缺点

IoC 方式

//轮毂
public class Tire {
    //    默认轮毂大小
    private int size = 17;

    public Tire(int size) {
        this.size = size;
    }

    public void init() {
        System.out.println("轮毂的 size 为 ——>  " + size);
    }
}
//底盘
public class Bottom {
    private Tire tire;

    public Bottom(Tire tire) {
        this.tire = tire;
    }
    public void init() {
        System.out.println("do Bottom");
//        装上轮胎
        tire.init();
    }
}
//车身
public class Framework {
    private Bottom bottom;

    public Framework(Bottom bottom) {
        this.bottom = bottom;
    }

    public void init() {
        System.out.println("do framework");
//        装上含轮胎和底盘的车身
        bottom.init();
    }
}
//完整的一台车
public class Car {
    private Framework framework;

    public Car(Framework framework) {
        this.framework = framework;
    }

    public void init() {
        System.out.println("do car");
//        装上含轮胎和底盘的车身
        framework.init();
    }
}
//最后在该类中 获取创建造车所需的所有类
public class Test {
    public static void main(String[] args) {
        Tire tire = new Tire(15);
        Bottom bottom = new Bottom(tire);
        Framework framework = new Framework(bottom);
        Car car = new Car(framework);
        car.init();
    }
}

图示区别

  • 相比于传统方式直接在构造方法中 new 对象,由类自身控制 其他类 的生命周期
  • IoC方式体现了控制反转的思想,具体体现在以下两个个方面:
  • 依赖注入:在类之间的依赖关系中,通过构造函数参数的方式将依赖的对象传递给依赖的类。例如,Bottom 类通过构造函数接收 Tire 对象,Framework 类通过构造函数接收 Bottom 对象, Car 类通过构造函数接收 Framework 对象。这样,对象的依赖关系由外部容器(在这里是 Test  类)负责创建和注入,实现了依赖关系的控制反转

  • 容器管理:在 Test 类中,创建了所有需要的对象实例,并将它们组装在一起。Test 类充当了容器的角色,负责管理对象的创建和依赖关系的注入。通过创建 Tire、Bottom、 Framework 和 Car 对象,并将它们逐层传递和注入,实现了对象的创建和依赖关系的控制

优势体现

  • 当需要增加客户自定义轮毂颜色时,此时我们仅需在 Tire 类中添加相应代码即可,从而大大降低了依赖类之间的耦合性

  • 蓝框为新增代码,相比于传统方法,其需修改和新增的代码是要少了很多的
  • 传统代码是 Car 控制并创建了 Framework,Framework 创建后又创建了 Bottom,依次往下,而 IoC 方式直接将控制权进行了反转,不再是上级对象创建并控制下级对象了,而是下级对象被注入到上级对象中,下级的控制权不再由上级类控制了,这样及时下级类发生任何改变,当前类都是不受影响的,这就是典型的控制反转

Spring IoC 

  • IoC 是一个思想,控制反转,此处反转给 Spring
  • Spring 是包含了众多工具方法的 IoC 容器
  • Spring IoC 是实现了 IoC 思想的具体框架
  • 其中的两个重要步骤为:
  1. 将对象存入到容器
  2. 从容器中取出对象
  • 学 Spring 最核心的功能就是:
  • 如何将对象存入到 Spring 中,再从 Spring 中获取对象的过程

对象存放到容器的好处

  • 将对象存储到 Spring IoC 中,其对象会随着框架的启动而创建,当我们想使用某个对象时,直接取就行了,使用完直接放回到 Spring IoC中即可
  • 相比于 new 对象的方式,当需要该对象时,需要现场创建,Spring IoC 的效率肯定就要高很多了

Spring IoC 的优点

  • 解耦
  • 使用更加方便(不再需要手动创建 和 关注某个对象背后的依赖关系)
  • 效率更高

  • Spring 是一个 IoC 容器
  • Spring 管理 对象的创建和销毁
  • 同时具有 存储对象 和 获取对象 的能力

DI

  •  DI 全称为 Dependency Injection,译为 依赖注入
  • 即在 IoC 容器在运行期间,动态地将某种依赖关系注入到对象中
  • 通过依赖注入,对象可以在运行时获取所需的依赖对象,而不需要在编译时硬编码依赖关系

DI 与 IoC 的关联

  • IoC 是一种设计思想,它强调将控制权从一个对象转移到外部容器或框架
  • DI 则是 IoC 的一种具体实现方式,它通过将对象所需的依赖对象从外部注入到对象中,解决了对象之间的高耦合问题

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

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

相关文章

Redis-持久化+主从架构

文章目录 Redis的持久化RDB模式异步持久化的实现AOF模式总结 Redis的主从架构1.端口以及文件调试测试2.主从配置3.数据同步原理(第一次同步为全局同步)4.增量同步5.主从配置优化6.问:master主机怎么判断从机slave是不是第一次同步数据? Redis…

Modelsim 使用教程(4)—— Working With Multiple Libraries

一、概述 在文中,我们将练习使用多个库。在实际的项目开发过程中,我们可能有多个库来组织设计,从第三方源代码访问IP,或者在仿真之间共享公共部分。我们将通过创建一个包含计数器设计单元的资源库来开始本文。接下来,我…

美团面试:Redis 除了缓存还能做什么?可以做消息队列吗?

这是一道面试中常见的 Redis 基础面试题,主要考察求职者对于 Redis 应用场景的了解。 即使不准备面试也建议看看,实际开发中也能够用到。 内容概览: Redis 除了做缓存,还能做什么? 分布式锁:通过 Redis 来做分布式锁是一种比较常见的方式。通常情况下,我们都是基于 Re…

VBA之正则表达式(44)-- 拆分商品和规格

实例需求:商品组清单保存在A列中,现需要将其拆分为商品名称,保存在从B列开始的后续单元格中,部分商品包含规格,并且多种规格属性使用了逗号分隔,因此无法直接使用Excel分列功能完成数据拆分。 示例代码如下…

BUUCTF 数据包中的线索 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 公安机关近期截获到某网络犯罪团伙在线交流的数据包,但无法分析出具体的交流内容,聪明的你能帮公安机关找到线索吗? 密文: 下载附件,解压得到一个.pcapng文…

基于SSM的同学录网站

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

【星海出品】VUE(一)

Windows安装nvm控制器 Windows里找都PowerShell。右击点击管理员运行。 1.安装choco Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString(https://chocolatey.org/install.ps1))2.安装NVM choco install nvm 3.查看可…

【HTML】播放器如何自动播放【已解决】

自动播放器策略 先了解浏览器的自动播放器策略 始终允许静音自动播放在以下情况,带声音的自动播放才会被允许 2.1 用户已经与当前域进行交互 2.2 在桌面上,用户的媒体参与指数阈值(MEI)已被越过,这意味着用户以前播放带有声音的视频。 2.3 …

一座 “数智桥梁”,华为助力“天堑变通途”

《水调歌头游泳》中的一句话,“一桥飞架南北,天堑变通途”,广为人们所熟知,其中展现出的,是中国人对美好出行的无限向往。 天堑变通途从来不易。 中国是当今世界上交通运输最繁忙、最快捷的国家之一,交通行…

Linux的常见指令(一)

目录 一、文件 二、常见指令 1、pwd 2、ls 1、ls -a 2、ls -l 3、ls -i ​编辑 3、touch 4、mkdir 5、cd 6、rmdir 和 rm 7、man 8、cp 一、文件 目录和文件是在磁盘上建立的,空文件是在磁盘上占用空间的(文件包括文件内容和文件的各种属…

学习 SpringMVC 必备的 4 大知识点

一、什么是 SpringMVC 前面我们了解了Spring、SpringBoot,那么 Spring MVC 又是什么呢?关于三者,我们可以这样理解:Spring MVC 是 Spring 框架的核心模块,而 Spring Boot 是 Spring 的脚手架。 Spring MVC 又称作 Sp…

Java多条件排序使用Comparator和thenComparing【包含排序List<Map<String, String>>】

Java多条件排序使用Comparator和thenComparing Comparator接口简介使用Comparator排序使用thenComparing实现多条件排序使用thenComparing排序Map 在Java中,对一个列表或集合进行排序时,经常需要基于多个条件来排序。幸运的是,Java提供了强大…

Rust 语言常见的一些概念(下)

目录 1、函数 参数 语句和表达式 具有返回值的函数 2、注释 文档注释 多行注释 3、控制流 3.1 if 表达式 3.2 使用esle if 处理多重条件 3.3 在 let 语句中使用 if 3.4 使用循环重复执行 使用 loop 重复执行代码 从循环中返回值 循环标签:在多个循环…

机器学习中的嵌入:释放表征的威力

简介 机器学习通过使计算机能够从数据学习和做出预测来彻底改变了人工智能领域。机器学习的一个关键方面是数据的表示,因为表示形式的选择极大地影响了算法的性能和有效性。嵌入已成为机器学习中的一种强大技术,提供了一种捕获和编码数据点之间复杂关系的…

LeetCode1518 换水问题

题目描述 超市正在促销,你可以用 numExchange 个空水瓶从超市兑换一瓶水。最开始,你一共购入了 numBottles 瓶水。 如果喝掉了水瓶中的水,那么水瓶就会变成空的。 给你两个整数 numBottles 和 numExchange ,返回你 最多 可以喝…

人工智能基础_机器学习015_BGD批量梯度下降代码演示_在批量梯度下降中使用逆时衰减---人工智能工作笔记0055

然后我们用代码来演示一下BGD批量梯度下降,首先启动jupyter notebook 然后我们新建一个文件 新建文件夹,然后新建一个python文件 然后我们这里用一元一次方程进行批量梯度下降. import numpy as np 导入数学计算包 X = np.random.rand(100,1) `np.random.rand(100, 1)` 是…

【每日一题】2103. 环和杆-2023.11.2

题目: 2103. 环和杆 总计有 n 个环,环的颜色可以是红、绿、蓝中的一种。这些环分别穿在 10 根编号为 0 到 9 的杆上。 给你一个长度为 2n 的字符串 rings ,表示这 n 个环在杆上的分布。rings 中每两个字符形成一个 颜色位置对 &#xff0c…

【AUTOSAR】【以太网】DoIp

AUTOSAR专栏——总目录_嵌入式知行合一的博客-CSDN博客文章浏览阅读217次。本文主要汇总该专栏文章,以方便各位读者阅读。https://xianfan.blog.csdn.net/article/details/132072415 目录 一、概述 二、功能描述 2.1 Do

06_es分布式搜索引擎2

一、DSL查询文档 1.DSL查询分类 ①查询所有:match_all ②全文检索:利用分词器对用户输入的内容分词,倒排索引去匹配 match_query multi_match_query ③精确查询:根据精确词条查找数据,查找的是keyword,数值,日期,b…

BUCK、BOOST、BUCK-BOOST电路原理分析

一、前导 DC-DC DC-DC电源,即直流-直流变换器,是指将一个固定的直流电压变换为可变的直流电压,也称为直流斩波器。DC-DC有多种拓扑结构,如BUCK(降压)、BOOST(升压)、BUCK-BOOST&…