当前位置: 首页 > news >正文

Spring是什么?关于Spring家族

初识Spring

什么是Spring?

Spring是一个开源的Java企业级应用程序开发框架,由Rod Johnson于2003年创建,并在接下来的几年里得到了广泛的发展和应用。它提供了一系列面向对象的编程和配置模型,支持开发各种类型的应用程序,包括Web应用、移动应用、消息传递应用、批处理应用等等。

Spring框架是一个轻量级的框架,其核心原则是面向接口编程控制反转(IoC)。

通过使用Spring框架,可以简化应用程序的开发、部署和测试,并提高应用程序的可维护性和可扩展性,总而言之使用Spring的根本目的就是为了简化Java开发

一句话概括Spring就是:Spring是包含了众多工具方法的IoC容器

Spring的优点?

  1. 方便解耦,简化开发:Spring框架实现了控制反转(IoC)和依赖注入(DI)等特性,可以将对象的创建和依赖关系交给Spring容器管理,从而大大简化了开发过程。
  2. AOP编程的支持:Spring提供了面向切面编程(AOP)的支持,可以方便地实现对程序进行权限拦截、运行监控等功能。
  3. 声明式事务的支持:Spring的事务管理机制可以通过配置来实现,从而实现声明式事务的效果,降低了手动编码的复杂性。
  4. 方便程序的测试:Spring对Junit4支持,可以通过注解方便地测试Spring程序。
  5. 方便集成各种优秀框架:Spring可以与各种优秀的开源框架无缝集成,如Struts、Hibernate、MyBatis等。
  6. 降低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&#xff0c;不限制 2.如何配置&#xff0c;修改内存大小 1) 查看最大占用内存 # maxmeory <bytes> 或者 config get maxmemory 2) 默认内存多少可以用: 64位系统下不限制&#xff0c;32位下最多3G 3) 如何配置: 默认总内存的3/4 4) 如何修改…...

别再只盯着GPS了!手把手教你用Python仿真UWB定位,30厘米精度是怎么来的?

用Python仿真UWB定位&#xff1a;从纳秒脉冲到30厘米精度的全流程解析 在室内导航、工业自动化或仓储物流等领域&#xff0c;定位精度直接决定了系统性能的上限。传统GPS在开阔地带表现优异&#xff0c;但一旦进入室内环境&#xff0c;其信号衰减和多径效应会导致定位误差急剧…...

从需求到SQL:手把手教你将‘住院管理系统’的ER图转化为可运行的数据表(附建表语句)

从需求到SQL&#xff1a;住院管理系统数据库设计实战指南 在医疗信息化快速发展的今天&#xff0c;一套设计良好的住院管理系统数据库不仅能提高医院运营效率&#xff0c;更能为患者提供更精准的医疗服务。本文将带你从零开始&#xff0c;完整实现一个住院病人信息管理系统的数…...

告别繁琐权限,uTools hosts插件一键切换与管理的效率革命

1. 为什么我们需要更优雅的hosts管理方案 每次修改hosts文件都要经历这样的痛苦循环&#xff1a;先要回忆文件藏在系统哪个角落&#xff0c;接着得用管理员身份打开文本编辑器&#xff0c;小心翼翼地修改内容&#xff0c;最后还要担心格式错误导致系统异常。作为经常需要切换开…...

Artichoke 未来展望:这个创新 Ruby 实现的路线图和愿景 [特殊字符]

Artichoke 未来展望&#xff1a;这个创新 Ruby 实现的路线图和愿景 &#x1f680; 【免费下载链接】artichoke &#x1f48e; Artichoke is a Ruby made with Rust 项目地址: https://gitcode.com/gh_mirrors/ar/artichoke Artichoke 是一个用 Rust 编写的创新 Ruby 实现…...

低功耗设计避坑指南:从UPF报错案例学习isolation rules的正确姿势

低功耗设计避坑指南&#xff1a;从UPF报错案例学习isolation rules的正确姿势 在芯片设计领域&#xff0c;低功耗已成为衡量产品竞争力的核心指标之一。随着工艺节点不断演进&#xff0c;静态功耗占比显著提升&#xff0c;使得电源门控&#xff08;Power Gating&#xff09;技术…...

解锁旧Mac新生命:技术伙伴如何突破苹果限制

解锁旧Mac新生命&#xff1a;技术伙伴如何突破苹果限制 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否曾想过&#xff0c;那些被苹果官方"抛弃"的老旧Ma…...

Wan2.2-I2V-A14B在微信小程序开发中的应用:实时图片转视频功能实现

Wan2.2-I2V-A14B在微信小程序开发中的应用&#xff1a;实时图片转视频功能实现 1. 引言 "一张照片能变成视频吗&#xff1f;"这是很多社交类小程序用户常有的疑问。想象一下&#xff0c;用户在电商小程序上传商品图片后&#xff0c;系统自动生成一段展示视频&#…...

MOOTDX终极指南:Python通达信数据接口让量化分析变得简单高效

MOOTDX终极指南&#xff1a;Python通达信数据接口让量化分析变得简单高效 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 你是否曾为获取股票数据而烦恼&#xff1f;面对复杂的API接口和繁琐的数据…...

OpenClaw自动化测试实践:GLM-4.7-Flash驱动脚本执行与结果分析

OpenClaw自动化测试实践&#xff1a;GLM-4.7-Flash驱动脚本执行与结果分析 1. 为什么选择OpenClaw做测试自动化&#xff1f; 上个月接手一个新项目时&#xff0c;我遇到了一个典型的技术矛盾&#xff1a;作为独立开发者&#xff0c;既需要保证代码质量&#xff0c;又没精力手…...

在AutoDL上搞定nuScenes数据集:从解压到mmdetection3d初始化(含避坑指南)

在AutoDL云端高效部署nuScenes数据集&#xff1a;全流程解析与实战避坑指南 nuScenes作为自动驾驶领域最具挑战性的3D感知数据集之一&#xff0c;包含1000个复杂城市场景的多模态数据。但对于刚接触云端GPU服务器的研究者来说&#xff0c;从数据解压到环境配置的每一步都可能遇…...