JavaEE进阶学习:Spring核心和设计思想

Spring 是什么

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

用⼀句话概括 Spring:Spring 是包含了众多工具方法IoC 容器

1.什么是容器

容器是用来容纳某种物品的(基本)装置。

我们学过的容器:
List/Map -> 数据存储容器
Tomcat -> Web 容器

2.什么是 IoC

Spring 也是⼀个容器,Spring 是什么容器呢?Spring 是⼀个 IoC 容器。

什么是 IoC?
IoC = Inversion of Control 翻译成中文是“控制(权)反转”的意思,也就是说 Spring 是⼀个“控制反转”的容器

控制(权)反转
对象的生命周期是由当前代码 / 程序员来控制的,当用了 Spring 时,就会由 Spring (Spring 容器)控制

Ioc 的优势
可以实现解耦(松耦合)

我们举 car 的例子来解释:
在这里插入图片描述

构建一辆车(Car Class),然而车需要依赖车身(FrameWork Class),而车身需要依赖底盘(BottomClass),而底盘需要依赖轮胎(Tire Class)

package old;/*** @projectName: test-2023-11-13* @package: old* @className: car* @author: 王嘉辉* @description:* @date: 2023/11/13 17:04* @version: 1.0*//*** 传统的开发*/
public class Car {//车身private FrameWork framework;public Car() {this.framework = new FrameWork();}public void init() {System.out.println("执行了 Car init 方法");framework.init();}
}
package old;/*** @projectName: test-2023-11-13* @package: old* @className: FrameWork* @author: 王嘉辉* @description:* @date: 2023/11/13 18:57* @version: 1.0*/
public class FrameWork {private Bottom bottom;public FrameWork() {this.bottom = new Bottom();}public void init() {System.out.println("执行了 FrameWork init 方法");bottom.init();}
}
package old;/*** @projectName: test-2023-11-13* @package: old* @className: Bottom* @author: 王嘉辉* @description:* @date: 2023/11/13 19:00* @version: 1.0*/
public class Bottom {private Tire tire;public Bottom() {this.tire = new Tire();}public void init() {System.out.println("执行了 Bottom init 方法");tire.init();}
}
package old;/*** @projectName: test-2023-11-13* @package: old* @className: Tire* @author: 王嘉辉* @description:* @date: 2023/11/13 19:01* @version: 1.0*/
public class Tire {private int size = 15;public void init() {System.out.println("执行了Tire init. Size: " + size);}
}
package old;/*** @projectName: test-2023-11-13* @package: old* @className: Test* @author: 王嘉辉* @description:* @date: 2023/11/13 19:04* @version: 1.0*/
public class Test {public static void main(String[] args) {Car car = new Car();car.init();}
}

我们需要加工多种尺寸的轮胎,就要对上述代码进行修改

package old;/*** @projectName: test-2023-11-13* @package: old* @className: car* @author: 王嘉辉* @description:* @date: 2023/11/13 17:04* @version: 1.0*//*** 传统的开发*/
public class Car {//车身private FrameWork framework;public Car(int size) {this.framework = new FrameWork(size);}public void init() {System.out.println("执行了 Car init 方法");framework.init();}
}
package old;/*** @projectName: test-2023-11-13* @package: old* @className: FrameWork* @author: 王嘉辉* @description:* @date: 2023/11/13 18:57* @version: 1.0*/
public class FrameWork {private Bottom bottom;public FrameWork(int size) {this.bottom = new Bottom(size);}public void init() {System.out.println("执行了 FrameWork init 方法");bottom.init();}
}
package old;/*** @projectName: test-2023-11-13* @package: old* @className: Bottom* @author: 王嘉辉* @description:* @date: 2023/11/13 19:00* @version: 1.0*/
public class Bottom {private Tire tire;public Bottom(int size) {this.tire = new Tire(size);}public void init() {System.out.println("执行了 Bottom init 方法");tire.init();}
}
package old;/*** @projectName: test-2023-11-13* @package: old* @className: Tire* @author: 王嘉辉* @description:* @date: 2023/11/13 19:01* @version: 1.0*/
public class Tire {private int size = 15;public Tire(int size) {this.size = size;}public void init() {System.out.println("执行了Tire init. Size: " + size);}
}
package old;/*** @projectName: test-2023-11-13* @package: old* @className: Test* @author: 王嘉辉* @description:* @date: 2023/11/13 19:04* @version: 1.0*/
public class Test {public static void main(String[] args) {Car car = new Car(20);car.init();}
}

当最底层代码改动之后,整个调用链上的所有代码都需要修改。

我们使用IoC解耦
在这里插入图片描述

package ioc;/*** @projectName: test-2023-11-13* @package: ioc* @className: Car* @author: 王嘉辉* @description:* @date: 2023/11/13 19:56* @version: 1.0*/
public class Car {private FrameWork frameWork;public Car(FrameWork frameWork) {this.frameWork = frameWork;//frameWork = new FrameWork();}public void init() {System.out.println("Car init");frameWork.init();}
}
package ioc;/*** @projectName: test-2023-11-13* @package: ioc* @className: FrameWork* @author: 王嘉辉* @description:* @date: 2023/11/13 20:00* @version: 1.0*/
public class FrameWork {private Bottom bottom;public FrameWork(Bottom bottom) {this.bottom = bottom;}public void init() {System.out.println("FrameWork init ");bottom.init();}
}
package ioc;/*** @projectName: test-2023-11-13* @package: ioc* @className: Bottom* @author: 王嘉辉* @description:* @date: 2023/11/13 20:01* @version: 1.0*/
public class Bottom {private Tire tire;public Bottom(Tire tire) {this.tire = tire;}public void init() {System.out.println("Bottom init");tire.init();}
}
package ioc;/*** @projectName: test-2023-11-13* @package: ioc* @className: Tire* @author: 王嘉辉* @description:* @date: 2023/11/13 20:02* @version: 1.0*/
public class Tire {private int size = 15;public Tire() {}public void init() {System.out.println("Tire init. Size: " + size);}
}
package ioc;/*** @projectName: test-2023-11-13* @package: ioc* @className: Test* @author: 王嘉辉* @description:* @date: 2023/11/13 20:03* @version: 1.0*//*** 模拟Ioc*/
public class Test {private Tire tire;private Bottom bottom;private FrameWork frameWork;private Car car;public Test() {this.tire = new Tire();this.bottom = new Bottom(this.tire);this.frameWork = new FrameWork(this.bottom);this.car = new Car(this.frameWork);}public static void main(String[] args) {Test test = new Test();test.car.init();}
}

代码经过以上调整,无论底层类如何变化,整个调用链是不⽤做任何改变的,这样就完成了代码之间的解耦,从而实现了更加灵活、通用的程序设计了。

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

通用程序的实现代码,类的创建顺序是反的,传统代码是 Car 控制并创建了Framework,Framework 创建并创建了 Bottom,依次往下,而改进之后的控制权发生的反转,不再是上级对象创建并控制下级对象了,而是下级对象把注入将当前对象中,下级的控制权不再由上级类控制了,这样即使下级类发生任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是 IoC 的实现思想。

3.Spring IoC

Spring 是包含了多个工具方法的 IoC 容器,这就是对Spring 最核心的总结。

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

  • 将对象存入到容器;
  • 从容器中取出对象。

也就是说学 Spring 最核心的功能,就是学如何将对象存入到 Spring 中,再从 Spring 中获取对象的过程。

将对象存放到容器中的好处:将对象存储在 IoC 容器相当于将以后可能用的所有⼯具制作好都放到仓库中,需要的时候直接取就行了,用完再把它放回到仓库。而 new 对象的方式相当于,每次需要工具了,才现做,⽤完就扔掉了也不会保存,下次再用的时候还得重新做,这就是 IoC 容器和普通程序开发的区别。

4.DI 概念说明

说到 IoC 不得不提的⼀个词就是“DI”,DI 是 Dependency Injection 的缩写,翻译成中⽂是“依赖注入”的意思。

所谓依赖注入,就是由 IoC 容器在运行期间,动态地将某种依赖关系注入到对象之中。所以,依赖注入(DI)和控制反转(IoC)是从不同的⻆度的描述的同⼀件事情,就是指通过引入 IoC 容器,利用依赖关系注入的方式,实现对象之间的解耦。

IoC 是“目标”也是⼀种思想,而目标和思想只是⼀种指导原则,最终还是要有可行的落地方案,而 DI就属于具体的实现。

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

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

相关文章

PP-ChatOCRv2、PP-TSv2、大模型半监督学习工具...PaddleX新特性等你来pick!

小A是一名刚刚毕业的算法工程师,有一天,他被老板安排了一个活,要对一批合同扫描件进行自动化信息抽取,输出结构化的分析报表。OCR问题不大,但是怎么进行批量的结构化信息抽取呢?小A陷入了苦苦思索… 小B是…

Java获取Jar、War包路径,并生成可编辑修改的本地配置文件

前言 本地的可修改配置文件的编写理应是一个很常用的功能,但由于数据库的存在,它鲜少被提及,大多数我们直接存储到数据库中了。 以至于现今,除了没接触数据库的新手时常使用它以外,它没有太多的出场机会。 也因此&am…

Hive数据表操作--学习笔记

1,Hive数据表操作 1,建表语句和内外部表 ①创建内部表 create [external] table [if not exists] 表名( 字段名 字段类型 [comment 注释], 字段名 字段类型 [comment 注释], ... ) [row format delimited fields terminated by 指定分隔符];&#xff0…

后端接口性能优化分析-问题发现问题定义

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码🔥如果感觉博主的文章还不错的话,请👍三连支持&…

使用requests库设置no_proxy选项的方法

问题背景 在使用requests库进行HTTP请求时,如果需要使用爬虫IP服务器,可以通过设置proxies参数来实现。proxies参数是一个字典,其中包含了爬虫IP服务器的地址和端口号。然而,当前的requests库并不支持通过proxies参数来设置no_pr…

【GitLab】-HTTP 500 curl 22 The requested URL returned error: 500~SSH解决

写在前面 本文主要介绍通过SSH的方式拉取GitLab代码。 目录 写在前面一、场景描述二、具体步骤1.环境说明2.生成秘钥3.GitLab添加秘钥4.验证SSH方式4.更改原有HTTP方式为SSH 三、参考资料写在后面系列文章 一、场景描述 之前笔者是通过 HTTP Personal access token 的方式拉取…

持续集成指南:GitHubAction 自动构建+部署AspNetCore项目

前言 之前研究了使用 GitHub Action 自动构建和发布 nuget 包:开发现代化的.NetCore控制台程序:(4)使用GithubAction自动构建以及发布nuget包 现在更进一步,使用 GitHub Action 在其提供的 runner 里构建 docker 镜像,之后提交到阿…

6块钱改变世界,网易和拼多多踏入同一条河流?

年底将至,各种颁奖盛典星光熠熠。如果要给今年深蹲反弹中的互联网大厂颁奖,2023表现最突出的可能是师出同门的兄弟网易和拼多多。 从市场表现来看,两家企业录得今年互联网中概股最高涨幅,被称为“中概股之光”:2023年…

【Spring Cloud】黑马头条 用户服务创建、登录功能实现

点击去看上一篇 一、创建用户 model 1.创建用户数据库库 leadnews_user 核心表 ap_user 建库建表语句 这里一定要使用 navicat,执行SQL 文件,以防止 cmd 中的编码问题 先将 SQL 语句,保存在电脑中,再使用 navicat 打开 CREATE…

华为eNSP综合实验考试

VLAN信息表 设备名称 端口 链路类型 VLAN 参数 HZ-HZCampus-Agg01-S5731 GE0/0/1 Trunk PVID:1 Allow-pass:10 20 Eth-trunk1(GE0/0/2,0/0/3,0/0/23) Trunk PVID:1 Allow-pass:10 20 GE0/0/24 Access PVID&#xf…

(免费)双相情感障碍筛查MDQ 在线测试双向情感障碍

MDQ用于筛查双相障碍,主要包含13个关于双相障碍症状的是非问题,当前测试采用的量表为2010年杨海晨博士翻译版。该量表为目前世界范围内最常用的双相障碍筛查量表,目前在精神科门诊最为常用的量表之一。 双向情感障碍筛查量表,也叫…

【linux】查看CPU的使用率

命令1:top top 总体系统信息 uptime:系统的运行时间和平均负载。tasks:当前运行的进程和线程数目。CPU:总体 CPU 使用率和各个核心的使用情况。内存(Memory):总体内存使用情况、可用内存和缓存…

我记不住的getopt_long的那些参数和返回值

前言:最近在学习面向Linux系统进行C语言的编程,通过查询man手册和查看网络上的各种文章来获取一点点的知识,重点是看完手册还是一脸懵逼,搞不懂手册里面再说啥,而本篇文章将记录一下学习getopt_long的那些参数和返回值…

adb手机调试常用命令

查看手机型号 adb shell getprop ro.product.model 查看电池状况 adb shell dumpsys battery 查看分辨率 adb shell wm size 查看屏幕密度 adb shell wm density 查看显示屏参数 adb shell dumpsys window displays 查看android_id adb shell settings get secure android…

Elasticsearch:运用向量搜索通过图像搜索找到你的小狗

作者:ALEX SALGADO 你是否曾经遇到过这样的情况:你在街上发现了一只丢失的小狗,但不知道它是否有主人? 了解如何使用向量搜索或图像搜索来做到这一点。 通过图像搜索找到你的小狗 您是否曾经遇到过这样的情况:你在街…

V10服务器安装virt-manage

kvm是什么 KVM(Kernel-based Virtual Machine, 即内核级虚拟机) 是一个开源的系统虚拟化模块。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。目前KVM已成为学术界的主流VMM之一,它包含一个为处理器提供底层虚拟化 可加载…

概率论和数理统计(三)数理统计基本概念

前言 “概率论”是给定一个随机变量X的分布F(x),然后求某事件A概率 P ( x ∈ A ) P(x \in A) P(x∈A)或者随机变量X的数字特征.“统计”是已知一组样本数据 { x 1 , x 2 , . . . x n } \{x_1,x_2,...x_n\} {x1​,x2​,...xn​},去求分布F(x) 统计的基本概念 在统计中&#x…

Vue3-admin-template 框架实现表单身份证获取到 出生年月、性别

一. 首先需效验输入身份证信息是否正确&#xff1a; const sfzhChange () > {// 效验身份证号格式const reg /^[1-9]\d{5}(19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/; }; 二.绑定输入框 input 事件&#xff1a; <el-form-item label&q…

监控直流防雷浪涌保护器综合方案

监控系统是一种广泛应用于安防、交通、工业、军事等领域的信息系统&#xff0c;它通过摄像机、传输线路、监控中心等设备&#xff0c;实现对目标区域的实时监视和控制。然而&#xff0c;监控系统也面临着雷电的威胁&#xff0c;雷电可能通过直击雷、感应雷、雷电波侵入等途径&a…

Linux服务器安装Dotnet8

1. 下载dotnet8 sdk 下载 .NET 8.0 SDK (v8.0.100) - Linux x64 Binaries 拿到 dotnet-sdk-8.0.100-linux-x64.tar.gz 文件 2. 把文件上传到 /usr/local/software 目录 mkdir -p /usr/local/software/dotnet8 把文件拷贝过去 mv dotnet-sdk-8.0.100-linux-x64.tar.gz /usr/loc…