2023.10.31 关于 Spring 的基本概念

目录

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.rhkb.cn/news/178634.html

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

相关文章

docker进阶

文章目录 docker 进阶Part1 常用命令总结docker version 查看docker客户端和服务端信息docker info 查看更加详细信息docker images 列出所有镜像基本用法常用选项 docker search 搜索镜像基本用法示例用法 docker pull 拉取镜像基本用法示例用法 docker rmi 删除镜像基本用法示…

FMC子卡解决方案:FMC214-基于FMC兼容1.8V IO的Full Camera Link 输出子卡

FMC214-基于FMC兼容1.8V IO的Full Camera Link 输出子卡 一、板卡概述   基于FMC兼容1.8V IO的Full Camera Link 输出子卡支持Base、Middle、Full Camera link信号输出,兼容1.8V、2.5V、3.3V IO FPGA信号输出。适配xilinx不同型号开发板和公司内部各FMC载板。北…

Macroscope安全漏洞检测工具简介

学习目标: 本介绍旨在帮助感兴趣者尽快了解 Macroscope,这是一款用于安全测试自动化和漏洞管理的企业工具。 全覆盖应用程序安全测试: 如下图所示,如果使用多种互补工具(SAST/DAST/SCA 等)来检测应用程序…

webgoat(A2) Broken Authentication

身份验证绕过 身份验证绕过以多种方式发生,但通常会利用配置或逻辑中的某些缺陷。篡改以达到正确的条件。 隐藏输入 最简单的形式是依赖于网页/DOM 中的隐藏输入。 删除参数 有时,如果攻击者不知道参数的正确值,他们可能会从提交中完全删…

安企神局域网监控软件,员工电脑终端的安全管理软件

安企神局域网监控软件,员工电脑终端的安全管理软件 安企神局域网监控软件下载使用 公司老板其实最怕的就是公司机密遭到泄露,而一般泄露的方法都是通过一些通讯软件而泄露出去的,如微信、qq等等,所以很多老板都想知道有什么软件…

idea 配置checkstyle全过程

checkstyle是提高代码质量,检查代码规范的很好用的一款工具,本文简单介绍一下集成的步骤,并提供一份完整的checkstyle的代码规范格式文件,以及常见的格式问题的解决方法。 一,安装 打开idea的文件选项,选择设置&…

Intel oneAPI笔记(1)--oneAPI简介、SYCL编程简介

oneAPI简介 Intel oneAPI是Intel提供的统一编程模型和软件开发框架。 它旨在简化可充分利用英特尔各种硬件架构(包括 CPU、GPU 和 FPGA)的应用程序的开发 oneAPI一个重要的特性是开放性,支持多种类型的架构和不同的硬件供应商,是…

记录一次时序数据库的实战测试

0x1.前言 本文章仅用于信息安全防御技术分享,因用于其他用途而产生不良后果,作者不承担任何法律责任,请严格遵循中华人民共和国相关法律法规,禁止做一切违法犯罪行为。文中涉及漏洞均以提交至教育漏洞平台。 0x2.背景 在某次Edus…

【Redis】Redis常用命令-getsetkeysexistsexpirettltype

文章目录 读取文档注意事项set命令get命令全局/通用命令KEYSEXISTSDELEXPIRETTLTYPE 读取文档注意事项 官方文档链接:https://redis.io/ 注意:redis的命令不区分大小写 在redis文档给出的语法格式说明: []:相当于一个独立的单元&a…

golang 发起 http 请求,获取访问域名的 ip 地址(net, httptrace)

前言 今天碰到了个需求,我要知道程序对外访问的 http 请求域名的 ip 地址。 直接查看 golang 的 net/http 包,发现 Response 中并没有我想要的 ip 信息。 考虑到在 OSI 七层模型中,ip 是网络层协议,而 http 是应用层协议。去翻…

计算机视觉的监督学习与无监督学习

什么是监督学习? 监督学习是一种机器学习算法,它从一组已标记的 合成数据生成器中生成的训练数据中学习。这意味着数据科学家已经用正确的标签(例如,“猫”或“狗”)标记了训练集中的每个数据点,以便算法可…

设计模式总结

1.将软件与设计模式比拟为城市与建筑模式,那么在面向对象的解决方案里,我们将对象和接口看成墙壁和门窗,模式的核心在于提供了相关问题的解决方案。 在软件设计中可能会遇到很多类似的问题,在每次遇到类似问题时我们不必全都新想…

MYSQL 多表联查详解

目录 一、一个案例引发的多表连接 二、笛卡尔积的错误和与正确的多表查询 2.1、笛卡尔积错误展示 2.2、笛卡尔积解决方法 2.3、练习 三、多表查询分类 3.1、等值连接 vs 非等值连接 3.2、自连接 vs 非自连接 3.3、内连接 vs 外连接 内连接(inner join&…

第2篇 机器学习基础 —(4)k-means聚类算法

前言:Hello大家好,我是小哥谈。聚类算法是一种无监督学习方法,它将数据集中的对象分成若干个组或者簇,使得同一组内的对象相似度较高,不同组之间的对象相似度较低。聚类算法可以用于数据挖掘、图像分割、文本分类等领域…

记录--这个前端Api管理方案会更好?

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 简介 大家好,前端小白一枚,目前接触后台管理系统比较多,经常遇到不同对象的增删改查的接口,如何对Api进行一个有比较好的管理是个问题。在学习偏函数的时…

C#中使用LINQtoSQL管理SQL数据库之添加、修改和删除

目录 一、添加数据 二、修改数据 三、删除数据 四、添加、修改和删除的源码 五、生成效果 1.VS和SSMS原始记录 2.删除ID2和5的记录 3.添加记录ID2、5和8 4.修改ID3和ID4的记录 用LINQtoSQL管理SQL Server数据库时,主要有添加、修改和删除3种操作。 项目中创…

app开发之后需要做什么

在完成app的开发之后,还有一系列的工作需要进行,以确保app的顺利上线和用户的良好体验。下面将从原理和详细介绍两个方面来介绍app开发之后需要做的工作。 一、原理介绍 1. 测试与调试:在app开发完成后,需要进行全面的测试与调试…

[论文笔记]RetroMAE

引言 RetroMAE,中文题目为 通过掩码自编码器预训练面向检索的语言模型。 尽管现在已经在许多重要的自然语言处理任务上进行了预训练,但对于密集检索来说,仍然需要探索有效的预训练策略。 本篇工作,作者提出RetroMAE,一个新的基于掩码自编码器(Masked Auto-Encoder,MAE)…

十种排序算法(1) - 准备测试函数和工具

1.准备工作 我们先写一堆工具&#xff0c;后续要用&#xff0c;不然这些写在代码里可读性巨差 #pragma once #include<stdio.h>//为C语言定义bool类型 typedef int bool; #define false 0 #define true 1//用于交互a和b inline void swap(int* a, int* b) {/*int c *a…