如何理解Spring?

article/2025/10/2 2:08:28

Spring 是包含了众多⼯具⽅法的 IoC 容器

那何为容器呢?容器是用来容纳某种东西的装置。比如:List/Map 是数据存储容器,Tomcat 是Web 容器等等。Spring 也是⼀个容器,是⼀个 IoC 容器。

那何为IoC 呢?IoC = Inversion of Control 翻译成中⽂是“控制反转”的意思,也就是说 Spring 是⼀个“控制反转”的容器。那控制反转具体是什么呢?下面代码举例:

构建⼀辆⻋(Car Class),然⽽⻋需要依赖⻋身(FrameWork Class),⽽⻋身需要依赖底盘(Bottom Class),⽽底盘需要依赖轮胎(Tire Class),最终程序的实现代码如下:

public class NewCarExample { public static void main(String[] args) { Car car = new Car(); car.init(); } /** * 汽⻋对象 */ static class Car { public void init() { // 依赖⻋身 Framework framework = new Framework(); framework.init(); } }/** * ⻋身类 */ static class Framework { public void init() { // 依赖底盘 Bottom bottom = new Bottom(); bottom.init(); } }/** * 底盘类 */ static class Bottom { public void init() { // 依赖轮胎 Tire tire = new Tire(); tire.init(); } }
/** * 轮胎类 */ static class Tire {
// 尺⼨ private int size = 30; public void init() { System.out.println("轮胎尺⼨:" + size); } } 
}

以上程序中,轮胎的尺⼨的固定的,然⽽随着对的⻋的需求量越来越⼤,个性化需求也会越来越多(比如轮胎大小,颜色,材质等等),这时候我们就需要修改轮胎类的代码,但是修改轮胎类代码就会影响到底盘类代码,修改底盘类代码就会影响到车身类代码,依次向上修改。这样的代码存在高度的耦合性。每一次调用链最底层发生改变,如果调用链很长,耦合性很高,那么整个调用链都需要修改代码。现在的需求就是修改任意类,不影响整个调用链,这种做法就叫做解耦

我们将控制权反转,此时,我们只需要将原来由⾃⼰创建的下级类,改为传递的⽅式(也就是注⼊的⽅式),因为我们不需要在当前类中创建下级类了,所以下级类即使发⽣变化(创建或减少参数),当前类本身也⽆需修改任何代码,这样就完成了程序的解耦。

public class IocCarExample { public static void main(String[] args) { Tire tire = new Tire(20); Bottom bottom = new Bottom(tire); Framework framework = new Framework(bottom); Car car = new Car(framework); car.run(); } static class Car { private Framework framework; public Car(Framework framework) { this.framework = framework; } public void run() { framework.init(); } } 
static class Framework { private Bottom bottom; public Framework(Bottom bottom) { this.bottom = bottom; }public void init() { bottom.init(); } }
static class Bottom { private Tire tire; public Bottom(Tire tire) { this.tire = tire; } public void init() { tire.init(); } } static class Tire { private int size; public Tire(int size) { this.size = size; } public void init() { System.out.println("轮胎:" + size); } } 
}

通过解耦,从⽽实现了更加灵活、通⽤的程序设计了。通⽤程序的实现代码,类的创建顺序是反的,传统代码是 Car 控制并创建了Framework,Framework 创建并创建了 Bottom,依次往下,⽽改进之后的控制权发⽣的反转,不再是上级对象创建并控制下级对象了,⽽是下级对象把注⼊到当前对象中,下级的控制权不再由上级类控制了,这样即使下级类发⽣任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是 IoC 的实现思想。

既然Spring 是⼀个IoC容器,那么它有两个最核心的功能:把对象存入容器和从容器中取出对象。

当谈到IoC,必然会谈到DI,DI 是 Dependency Injection 的缩写,翻译成中⽂是“依赖注⼊”的意思。从广义上老说,IoC和DI其实说的是一回事,但是也有区别的。这样理解,IoC是一种思想,而DI就是这种思想的具体实现。举个例子:今天晚上要去吃一顿好的,这就是一个思想,那今天晚上去吃海底捞吧,吃海底捞这就是DI,一种具体实现。

总结:Spring 是包含了众多⼯具⽅法的 IoC 容器,它里面包含了两个最核心的功能:将对象存入容器,从容器将对象取出来,供其它类使用。跟Spring相关的两个概念,一个是IoC,一个是DI。IoC是一种思想,而DI是这种思想的一种具体实现。


http://chatgpt.dhexx.cn/article/UfTur299.shtml

相关文章

【spring】spring是什么?详解它的特点与模块

作者:Insist-- 个人主页:insist--个人主页 作者会持续更新网络知识和python基础知识,期待你的关注 目录 一、spring介绍 二、spring的特点(七点) 1、简化开发 2、AOP的支持 3、声明式事务的支持 4、方便测试 5、…

Spring - 什么是spring?

好久没更新博客了,今天小更一波。 学习java已经有一段时间了,今天将接触Spring框架技术。 什么是Spring? spring 中文意思就是 春天,实际上spring 是真的给软件行业带来了春天。 使用spring的好处? spring可以解决企业级开发…

Spring和Spring Boot区别

spring和spring boot区别 二者主要区别是: 1、Spring Boot提供极其快速和简化的操作,让 Spring 开发者快速上手。 2、Spring Boot提供了 Spring 运行的默认配置。 3、Spring Boot为通用 Spring项目提供了很多非功能性特性。 一、Spring Boot和Sprin…

作为一个程序员,读不懂Spring就像读不懂对象的心?

???连读同事写的代码都费劲,还读Spring? 咋的,Spring 很难读! 这个与我们码农朝夕相处的 Spring,就像睡在你身边的媳妇,你知道找她要吃、要喝、要零花钱、要买皮肤。但你不知道她的仓库共有多少存粮、也…

【Spring源码这样读】-怎么阅读源码

做开发要不要读源码?如果你天天996,真心的不建议你去读源码(我是不介意做一个劝退师的)。读源码确确实实是一个费时费力的活,如果你每天都很忙,偶尔看一眼,想了解其中的奥秘,这很难办…

CRUD搬砖两三年了,怎么阅读Spring源码?

作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!😄 👨‍💻连读同事写的代码都费劲,还读Spring? 咋的,Spring 很难读&…

一、如何阅读Spring源码(全网最简单的方法)

学习Java最好最有效的方法是学习Spring,但是最笨最没效的方法也是学习Spring。 为什么这么说呢?道理其实很简单 A、Spring很庞大,很完善,也非常的底层,如果我们学会的Spring,那么也就掌握了很多的技术的核心…

【Spring】——Spring简单 读和取

前言 ❤️❤️❤️Spring专栏更新中,各位大佬觉得写得不错,支持一下,感谢了!❤️❤️❤️ Spring_冷兮雪的博客-CSDN博客 上期我们讲解了Spring的创建与使用,发现 将Bean 注册到容器 这一步中,如果Bean对象…

读取Spring配置文件的方法(Spring读取资源文件)

大厂必备!读取spring配置文件的两种方法,需要的朋友可以参考下。 第一种: 1.spring配置文件 2.读取属性方法 第二种: 直接读取方式: 通过spring配置方式读取: spring bean配置: // 编辑不易,spring框架系列的快要更…

php如何将时间戳,PHP如何将时间戳转换日期

PHP如何将时间戳转换日期 在php中可以使用“date()”函数将时间戳转换日期,该函数用于格式化一个本地时间日期,其语法是“date($format,$timestamp)”,其参数format表示日期格式,参数timestamp表示要格式化的时间戳。 代码实例&am…

php 时间戳 24小时制,php如何将时间戳转换成小时制

php将时间戳转换成小时制的方法:【date("Y/m/d H:i:s",1446634507)】。date()函数可以把时间戳格式化为可读性更好的日期和时间。 php将时间戳转换称24小时制 (推荐教程:php视频教程)date("Y/m/d H:i:s",1446634507) //2015/11/04 1…

php时间戳转换日期24,php时间戳怎么转换回日期

在php中,可以使用date()函数来将时间戳转换回日期格式。date()函数可把时间戳格式化为可读性更好的日期和时间格式,语法“date (format,时间戳)”;format参数规定转换后的时间戳格式,例“Y-m-d H:i:s”。 本教程操作环境&#xff…

php里日期转为时间戳_php时间戳与日期的转换

php时间戳与日期的转换 大家也许对PHP时间戳已经有所了解,那么我们如何应用它来获取具体的日期呢?我们今天来为大家介绍一下PHP时间戳获取当前时期的具体方式。 实现功能:获取某个日期的时间戳,或获取某个时间的PHP时间戳。 strto…

html 时间戳转换年月日,时间戳与日期的转换方法

php怎么将指定日期转换为时间戳 date(Y-m-d H:i:s, 1156219870); UNIX时间戳转换为日期用函数: date() 一般形式:date(Y-m-d H:i:s, 1156219870); 日期转换为UNIX时间戳用函数:strtotime() 一般形式:strtotime(2010-03-24 08:15:42); js 中日期 转换成时间戳 例如2013-08-…

常用的计算机C语言,计算机c语言基础知识

计算机c语言基础知识 C语言程序设计是高效计算机专业学生必修的一门基础课程,那么你对计算机c语言了解多少呢?下面是小编整理的计算机c语言基础知识,欢迎大家阅读参考。 计算机c语言的特性 C语言是世界上最流行、使用最广泛的高级程序设计语言之一。在操…

C语言基础知识总结

本文的目的是记录平时工作学习过程中学习到的C语言知识,由于单独一篇文章记录的话可能篇幅过少,因此置顶此文用作此用处,本文从2017-12-16开始记录,后续新增内容不单独列出时间,在MarkEditor中有相应的版本记录。 文件…

【必读】C语言基础知识大全

C语言程序的结构认识 用一个简单的c程序例子,介绍c语言的基本构成、格式、以及良好的书写风格,使小伙伴对c语言有个初步认识。 例1:计算两个整数之和的c程序: #include main() { int a,b,sum; /*定义变量a,b,sum为整…

C语言基础知识概况

一、什么是C语言 就如人的语言分汉语英语,作用是实现人与人之间的交流相同。C语言是一门计算机语言。实现人与计算机交互的一种语言。C语言是一门广泛用于底层开发的编程语言 计算机的结构自上而下大概分为以下几层 应用软件QQ、网盘用户操作系统windows、Linux硬…

c语言基础知识 入门必看(保姆级教学)

🍓个人主页:bit.. 🍒系列专栏:Linux(Ubuntu)入门必看 C语言刷题 C语言基础 1.什么是C语言?为什么要学好C语言? 这是2022年球程序员使用计算机语言的排名:我们可以很清楚的看的c语言和c在将…

C语言基础知识入门(大全详解)

一、C语言基础知识入门 C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好,可以用来开发应用软件、驱动、操作系统等。C语言也是其它众多高级语言的鼻祖语言,所以说学习C语…