Spring是什么?关于Spring家族
初识Spring
什么是Spring?
Spring是一个开源的Java企业级应用程序开发框架,由Rod Johnson于2003年创建,并在接下来的几年里得到了广泛的发展和应用。它提供了一系列面向对象的编程和配置模型,支持开发各种类型的应用程序,包括Web应用、移动应用、消息传递应用、批处理应用等等。
Spring框架是一个轻量级的框架,其核心原则是面向接口编程和控制反转(IoC)。
通过使用Spring框架,可以简化应用程序的开发、部署和测试,并提高应用程序的可维护性和可扩展性,总而言之使用Spring的根本目的就是为了简化Java开发。
一句话概括Spring就是:Spring是包含了众多工具方法的IoC容器。
Spring的优点?
- 方便解耦,简化开发:Spring框架实现了控制反转(IoC)和依赖注入(DI)等特性,可以将对象的创建和依赖关系交给Spring容器管理,从而大大简化了开发过程。
- AOP编程的支持:Spring提供了面向切面编程(AOP)的支持,可以方便地实现对程序进行权限拦截、运行监控等功能。
- 声明式事务的支持:Spring的事务管理机制可以通过配置来实现,从而实现声明式事务的效果,降低了手动编码的复杂性。
- 方便程序的测试:Spring对Junit4支持,可以通过注解方便地测试Spring程序。
- 方便集成各种优秀框架:Spring可以与各种优秀的开源框架无缝集成,如Struts、Hibernate、MyBatis等。
- 降低Java EE API的使用难度:Spring提供了许多方便的API和工具类来简化Java EE API的使用,从而降低了使用难度。
什么是容器?
我们说Spring是包含了众多工具方法的IoC容器。那么,什么是容器?
容器是用来容纳某种物品的装置。在Java中,容器就是用来容纳某种对象的装置。
之前我们曾接触到的容器有:线程池、Map、队列、Tomcat......
什么是IoC?
IoC的全称为:Inversion of Control。也就是:控制反转。
IoC是一个面向对象编程的设计原则,也是Spring框架的核心思想之一。
IoC的基本思想是将对象的创建和依赖关系的维护交给容器来管理,从而使得程序更加松耦合、可维护和可扩展。
举一个例子:
如果我们要做一个电脑。我们的基本思路是这样子的:

制作一个电脑,电脑的运行需要电脑配置,配置有软件和硬件配置,这里我们只选取了硬件配置。而硬件配置中我们选取了CPU。最终的程序实现代码如下:
import javax.security.auth.login.AppConfigurationEntry;
import javax.security.auth.login.Configuration;public class NewComputer {//制作一个电脑public static void main(String[] args) {Computer computer=new Computer();computer.init();}//电脑对象static class Computer{public void init(){//依赖配置Configuration configuration=new Configuration();configuration.init();}}//配置对象static class Configuration{public void init(){//依赖硬件Hardware hardware=new Hardware();hardware.init();}}//配置硬件static class Hardware{public void init(){//依赖CPUCpu cpu=new Cpu();cpu.init();}}//配置CPUstatic class Cpu{private String model = "Intel的酷睿core系列";public void init(){System.out.println("CPU型号——>"+model);}}
}
import javax.security.auth.login.AppConfigurationEntry;
import javax.security.auth.login.Configuration;public class NewComputer {//制作一个电脑public static void main(String[] args) {Computer computer=new Computer();computer.init();}//电脑对象static class Computer{public void init(){//依赖配置Configuration configuration=new Configuration();configuration.init();}}//配置对象static class Configuration{public void init(){//依赖硬件Hardware hardware=new Hardware();hardware.init();}}//配置硬件static class Hardware{public void init(){//依赖CPUCpu cpu=new Cpu();cpu.init();}}//配置CPUstatic class Cpu{private String model = "Intel的酷睿core系列";public void init(){System.out.println("CPU型号——>"+model);}}
}
上面代码的运行效果如下:

那如果,这个时候我们定制电脑的顾客不想要这个型号的CPU,想换个型号使用。那么,这个时候我们需要该的东西就变得很多了。
如下:
public class NewComputers {//制作一个电脑public static void main(String[] args) {Computer computer=new Computer("AMD的锐龙Ryzen系列");computer.run();}//电脑对象static class Computer{private Configuration configuration;public Computer(String model){configuration=new Configuration(model);}public void run(){//依赖配置configuration.init();}}//配置对象static class Configuration{private Hardware hardware;public Configuration (String model){hardware=new Hardware(model);}public void init(){//依赖硬件hardware.init();}}//配置硬件static class Hardware{private Cpu cpu;public Hardware (String model){cpu=new Cpu(model);}public void init(){//依赖CPUcpu.init();}}//配置CPUstatic class Cpu{private String model;public Cpu(String model){this.model=model;}public void init(){System.out.println("CPU型号——>"+model);}}
}public class NewComputers {//制作一个电脑public static void main(String[] args) {Computer computer=new Computer("AMD的锐龙Ryzen系列");computer.run();}//电脑对象static class Computer{private Configuration configuration;public Computer(String model){configuration=new Configuration(model);}public void run(){//依赖配置configuration.init();}}//配置对象static class Configuration{private Hardware hardware;public Configuration (String model){hardware=new Hardware(model);}public void init(){//依赖硬件hardware.init();}}//配置硬件static class Hardware{private Cpu cpu;public Hardware (String model){cpu=new Cpu(model);}public void init(){//依赖CPUcpu.init();}}//配置CPUstatic class Cpu{private String model;public Cpu(String model){this.model=model;}public void init(){System.out.println("CPU型号——>"+model);}}
}
不难看出,在我们更改底层某个参数后,以次向上我们需要更改很多代码。
如何解决这个问题呐?
我们只需要把原来由自己创建的下级类,改为传递的方式(即注入的方式),这样就完成了程序的解耦。
程序的解耦是指将程序中各个模块之间的依赖关系降低,使得不同的模块相互独立、耦合度低,从而达到易于维护、易于修改、易于扩展的目的。
控制反转
我们说Spring的其中一个优点是:Spring框架实现了控制反转(IoC)和依赖注入(DI)等特性,可以将对象的创建和依赖关系交给Spring容器管理,从而大大简化了开发过程。
那么,什么是控制反转,什么是依赖注入?
还是上面的代码,我们将其创建子类的方式,改为注入传递的方式来理解何为控制反转。
public class IocNewComputers {//制作一个电脑public static void main(String[] args) {Cpu cpu=new Cpu("AMD的锐龙Ryzen系列");Hardware hardware=new Hardware(cpu);Configuration configuration=new Configuration(hardware);Computer computer=new Computer(configuration);computer.run();}//电脑对象static class Computer{private Configuration configuration;public Computer(Configuration configuration){this.configuration=configuration;}public void run(){//依赖配置configuration.init();}}//配置对象static class Configuration{private Hardware hardware;public Configuration (Hardware hardware){this.hardware=hardware;}public void init(){//依赖硬件hardware.init();}}//配置硬件static class Hardware{private Cpu cpu;public Hardware (Cpu cpu){this.cpu=cpu;}public void init(){//依赖CPUcpu.init();}}//配置CPUstatic class Cpu{private String model;public Cpu(String model){this.model=model;}public void init(){System.out.println("CPU型号——>"+model);}}
}public class IocNewComputers {//制作一个电脑public static void main(String[] args) {Cpu cpu=new Cpu("AMD的锐龙Ryzen系列");Hardware hardware=new Hardware(cpu);Configuration configuration=new Configuration(hardware);Computer computer=new Computer(configuration);computer.run();}//电脑对象static class Computer{private Configuration configuration;public Computer(Configuration configuration){this.configuration=configuration;}public void run(){//依赖配置configuration.init();}}//配置对象static class Configuration{private Hardware hardware;public Configuration (Hardware hardware){this.hardware=hardware;}public void init(){//依赖硬件hardware.init();}}//配置硬件static class Hardware{private Cpu cpu;public Hardware (Cpu cpu){this.cpu=cpu;}public void init(){//依赖CPUcpu.init();}}//配置CPUstatic class Cpu{private String model;public Cpu(String model){this.model=model;}public void init(){System.out.println("CPU型号——>"+model);}}
}
这个时候如果我们需要更改CPU的选择只用在main方法里更改参数值就好了。
此时制作电脑的流程就改变了:

我们可以看到传统的代码是由Computer来控制并创建子类,依次类推。而IoC则是由将下级对象注入到当前对象中,下级的控制权此时不在由上级类控制。
传统的Java SE程序设计中,我们通过new关键字在对象内部直接创建和控制依赖对象,而在IoC设计中,我们将对象交给IoC容器来管理和控制,IoC容器负责创建、配置和管理bean,也就是它管理着bean的生命周期,因此控制权在IoC容器中。
DI
DI是依赖注入(Dependency Injection)的缩写。
依赖注入是一种设计模式,它可以通过将依赖关系的创建和维护交给外部容器来管理,以降低组件之间的耦合度,提高代码的可维护性和可扩展性。通常情况下,我们使用DI将一个对象的依赖关系注入到另一个对象中,而不是在对象内部创建和控制依赖对象。
IoC是一种思想,而DI是这种思想的一种具体实现。

Spring家族的主要成员
Spring Framework
Spring Framework 是一个开源框架,用于创建 Java 应用程序的全栈式企业级应用程序开发的基础设施。它提供了一系列库和工具,可以方便地解决 Java 开发中的常见问题,例如面向切面编程、IoC(控制反转)、DI(依赖注入)和集成 JPA 和 Hibernate 等 ORM 工具。Spring Framework 的目标是让 Java 开发变得更加简单、快速、高效并且完整。
Spring Boot
Spring Boot降低了开发生产级Spring应用的门槛。
Spring Boot是一个基于Spring Framework的快速开发框架,可以用来快速构建独立的、生产级别的、基yuSpring的应用程序。它采用约定优于配置的方式,通过自动配置和准备好的模板,将开发人员从繁琐的配置中解放出来,使得开发人员可以更加专注于业务逻辑的实现。
Spring Boot提供了丰富的功能和库,包括Web应用、安全性、数据访问和集成测试等。它还有很好的可扩展性,并且可以轻松地与其他Spring项目(例如Spring Cloud)集成,以支持在云环境中构建和部署应用程序。
Spring Boot提供的起步依赖很好解决了Spring应用的依赖管理困难;Spring Boot的另一大亮点是自动配置,该功能减少了Spring应用的配置量
Spring Cloud
Spring Cloud 是一个开源的、用于构建分布式系统的框架。它基于 Spring Boot,提供了一套简单易用的工具,可以帮助开发人员快速地构建和部署云原生应用程序,并解决云原生应用程序中常见的问题,例如注册和发现服务、配置管理、负载均衡、熔断器、智能路由等。Spring Cloud 基于微服务架构,提供分布式系统中诸多核心功能组件,可以为企业级应用的云原生化提供全方位的支持。
Spring Data
Spring Data 是 Spring Framework 的一个子项目,它为数据访问提供了一致的编程模型和简化的编码技巧。Spring Data 旨在简化与关系型数据库、NoSQL 数据库、MapReduce 框架和云数据库等不同类型的数据库进行交互的工作。Spring Data 的主要目标是提供一种简单的编程模型,以减少数据访问代码的重复性,并通过提供通用接口来减少开发人员需要编写的样板代码。
Spring Data 提供了一些常用的技术,包括Spring Data JPA、Spring Data MongoDB、Spring Data Redis等。它们都遵循了统一的设计理念和规范,并且相互之间可以方便地集成,使得开发人员可以轻松地适配不同的数据存储解决方案,从而更专注于业务逻辑的实现。
相关文章:
Spring是什么?关于Spring家族
初识Spring 什么是Spring? Spring是一个开源的Java企业级应用程序开发框架,由Rod Johnson于2003年创建,并在接下来的几年里得到了广泛的发展和应用。它提供了一系列面向对象的编程和配置模型,支持开发各种类型的应用程序&#x…...
自然语言处理数据集集锦(持续更新ing...)
诸神缄默不语-个人CSDN博文目录 最近更新时间:2023.4.26 最早更新时间:2023.4.25 文本摘要主题的数据集见我之前写的另一篇博文:文本摘要数据集的整理、总结及介绍(持续更新ing…) 智能司法主题的数据集我准备等项目…...
93、Dehazing-NeRF: Neural Radiance Fields from Hazy Images
简介 论文:https://arxiv.org/pdf/2304.11448.pdf 从模糊图像输入中恢复清晰NeRF 使用大气散射模型模拟有雾图像的物理成像过程,联合学习大气散射模型和干净的NeRF模型,用于图像去雾和新视图合成 通过将NeRF 3D场景的深度估计与大气散射模…...
JAVA子类与继承
目录 JAVA子类与继承 一、子类与父类: 二、子类与对象 三、成员变量的隐藏和方法重写 四、super关键字(P122) 五、final关键字 六、对象的上转型对象(P126) 七、继承与多态(P128) 八、abstract类和…...
62 openEuler 22.03-LTS 搭建MySQL数据库服务器-管理数据库
文章目录 62 openEuler 22.03-LTS 搭建MySQL数据库服务器-管理数据库62.1 创建数据库示例 62.2 查看数据库示例 62.3 选择数据库示例 62.4 删除数据库示例 62.5 备份数据库示例 62.6 恢复数据库示例 62 openEuler 22.03-LTS 搭建MySQL数据库服务器-管理数据库 62.1 创建数据库…...
【分布式搜索引擎ES01】
分布式搜索引擎ES 分布式搜索引擎ES1.elasticsearch概念1.1.ES起源1.2.倒排索引1.2.1.正向索引1.2.2.倒排索引 1.3.es的一些概念1.3.1.文档和字段1.3.2.索引和映射1.3.3.mysql与elasticsearch 1.4.1安装es、kibana、IK分词器1.4.2扩展词词典与停用词词典 2.索引库操作2.1.mappi…...
1.3 鞅、停时和域流-鞅(布朗运动与随机计算【习题解答】)
Let X = ( x n , F n ) , n = 1 , ⋯ , N X=\left(x_n, \mathcal{F}_n\right), n=1, \cdots, N X...
十、ElasticSearch 实战 - 源码运行
一、概述 想深入理解 Elasticsearch,了解其报错机制,并有针对性的调整参数,阅读其源码是很有必要的。此外,了解优秀开源项目的代码架构,能够提高个人的代码架构能力 阅读 Elasticsearch 源码的第一步是搭建调试环境&…...
GPT-3 论文阅读笔记
GPT-3模型出自论文《Language Models are Few-Shot Learners》是OpenAI在2020年5月发布的。 论文摘要翻译:最近的工作表明,通过对大量文本进行预训练,然后对特定任务进行微调(fine-tuning),在许多NLP任务和基准测试上…...
方案解析丨数字人主播如何成为电商直播新标配
浙江省政府办公厅近日印发《关于进一步扩大消费促进高质量发展若干举措》支持电子商务直播发展。抢抓电子商务直播快速发展机遇,发展数字人虚拟主播、元宇宙新消费场景等新业态新模式。 随着电商直播快速发展,企业怎么高效地实现引流获客,成为…...
Python最全迭代器有哪些?
python中迭代器的使用是最广泛的,凡是使用for语句,其本质都是迭代器的应用。 从代码角度看,迭代器是实现了迭代器协议的对象或类。迭代器协议方法主要是两个: __iter__()__next__() __iter__()方法返回对象本身,他是…...
ESP32 网络计时器,包含自动保存
简介 本代码是基于ESP32开发板实现的一个计时器功能,具备倒计时、计时器时长选择、显示当前时间、有源蜂鸣器报警等功能。代码中使用了WiFi网络连接、NTP时间同步、EEPROM存储等功能。通过按钮控制计时器的开始、停止和计时器时长的选择。 运行原理概述 在ESP32开…...
【ChatGPT】阿里版 ChatGPT 突然官宣意味着什么?
Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员,2024届电子信息研究生 目录 阿里版 ChatGPT 突然官宣 ChatGPT 技术在 AI 领域的重要性 自然语言生成 上下文连续性 多语言支持 ChatGPT 未来可能的应用场景 社交领域 商业领域 编辑 医疗领域…...
IPEmotion控制模块-PID循环应用
IPEmotion专业版、开发版支持控制模块,并且该模块支持函数发生器、PID控制器、路由器、序列控制和序列控制块以及参考曲线生成器。本文主要针对PID(P:Proportional control 比例控制;I:Integral control 积分控制&…...
【元分析研究方法】学习笔记2.检索文献(含100种学术文献搜索清单链接)
检索文献 该步骤的作用该步骤中需要注意的问题该步骤中部分知识点我的收获 参考来源:库珀 (Cooper, H. M. )., 李超平, & 张昱城. (2020). 元分析研究方法: A step-by step approach. 中国人民大学出版社. 该步骤的作用 1.识别相关文献的来源; 2.识别…...
题目:16版.自由落体
1、实验要求 本实验要求:模拟物体从10000米高空掉落后的反弹行为。 1-1. 创建工程并配置环境: 1-1.1. 限制1. 工程取名:SE_JAVA_EXP_E009。 1-1.2. 限制2. 创建包,取名:cn.campsg.java.experiment。 1-1.3. 限制3. 创建…...
视频可视化搭建项目,通过简单拖拽方式快速生产一个短视频
一、开源项目简介 《视搭》是一个视频可视化搭建项目。您可以通过简单的拖拽方式快速生产一个短视频,使用方式就像易企秀或百度 H5 等 h5 搭建工具一样的简单。目前行业内罕有关于视频可视化搭建的开源项目,《视搭》是一个相对比较完整的开源项目&#…...
network-1 4 layer internet model
4layer model applicationtransport tcp: transmission control protocol enable correct in-order delivery of data, running on top of the network layer service.udp: user datagram protocolnetwork packet:data、from、tonetwork->linkiplink source en…...
计算机网络笔记(横向)
该笔记也是我考研期间做的整理。一般网上的笔记是按照章节纪录的,我是按照知识点分类纪录的,大纲如下: 文章目录 1. 各报文1.1 各报文头部详解1.2 相关口诀 2. 各协议2.1 各应用层协议使用的传输层协议与端口2.2 各协议的过程2.2.1 数据链路层…...
0.redis-实践
1.redis内存设置多少,默认是0,不限制 2.如何配置,修改内存大小 1) 查看最大占用内存 # maxmeory <bytes> 或者 config get maxmemory 2) 默认内存多少可以用: 64位系统下不限制,32位下最多3G 3) 如何配置: 默认总内存的3/4 4) 如何修改…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
工厂方法模式和抽象工厂方法模式的battle
1.案例直接上手 在这个案例里面,我们会实现这个普通的工厂方法,并且对比这个普通工厂方法和我们直接创建对象的差别在哪里,为什么需要一个工厂: 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类: 两个发…...

