当我们谈论Spring的时候到底在谈什么

来自APOD
题图来自APOD

你好,这里是codetrend专栏“Spring6全攻略”。欢迎点击关注查看往期文章。

Spring对于不做程序开发的人来说字面意思就是春天,四季的开始。

对于程序员来说这个单词完全拥有另外一个含义,Spring指的是一个开源项目,而这个项目非常厉害。

Spring这个术语在不同的语境中有不同的含义。它可以用来指代Spring Framework项目本身。随着时间的推移,其他Spring项目也建立在Spring Framework之上。当人们说“Spring”时,通常指的是整个项目家族。

Spring Framework被分为多个模块。应用程序可以选择它们需要的模块。在核心部分是核心容器的模块,包括配置模型和依赖注入机制。

除此之外,Spring Framework为不同的应用架构提供了基础支持,包括消息传递、事务性数据和持久性,以及Web。它还包括基于Servlet的Spring MVC Web框架,同时也有Spring WebFlux响应式Web框架。

Spring的来龙去脉可以通过这个Mermaid流程图表示。

实现
包含
Jakarta/Java_EE
Spring_Framework
Spring项目

Spring与企业应用开发

Java EE(Java Platform, Enterprise Edition)是一种基于Java编程语言的企业级应用程序开发平台。它提供了一套全面的API和运行时环境,用于简化企业级应用程序的开发和部署。Java EE包括各种技术规范和API,如Servlets、JSP、EJB、JPA、JMS等,旨在帮助开发者构建可靠、安全、可扩展的企业级应用程序。

Java EE 也是是一个不断发展的解决方案,它设计的接口和框架以及整个解决方案在Spring框架中都有体现。也就是说Spring是Java EE的继承者和发扬者。

Spring使得创建Java企业应用程序变得简单。它提供了一切您在企业环境中需要的内容,支持Groovy和Kotlin作为JVM上的替代语言,并灵活地根据应用程序的需求创建多种架构。从Spring Framework 6.0开始,Spring要求使用Java 17或更高版本。

Spring支持广泛的应用场景,而这些解决方案就是为企业开发而生。在大型企业中,应用程序通常存在很长时间,必须在开发人员无法控制的JDK和应用服务器上运行。其他应用可能作为一个包含嵌入式服务器的单个jar文件运行,可能在云环境中。还有一些可能是独立的应用程序(如batch 或者 integration workloads),不需要服务器。

Spring是开源的。这也是Spring成功的秘诀之一。它拥有庞大而活跃的社区,基于各种真实用例提供持续反馈。Spring通过不断迭代、不断不断发展变得强大。

Spring的历史

Spring 框架诞生于 2003 年,是为了应对早期 J2EE 规范的复杂性而开发的。

尽管有人认为 Java EE 及其现代继承者 Jakarta EE 与 Spring 处于竞争关系,但实际上它们是互补的。

Java Specification Requests (JSRs) 是 Java Community Process (JCP) 下制定的技术规范提案,它代表了一种标准化的过程。每个 JSR 都是为了定义或更新 Java 平台的一部分,涵盖了从核心语言、API 到企业级平台的各种技术规格。比如 Servlet API(JSR 340)、WebSocket API(JSR 356)、JPA(JSR 338) 等都是 JSR 规范的具体实例,它们定义了 Java 开发人员应该遵循的标准接口和实现。

Spring框架实现了 JSR 规范。通过JSR规范既可以保持框架的一定兼容性,又能保证框架的推广和保持流行。但实现规范是一个选择性的过程,Spring6框架的轻量级设计思想决定了实现规范的选择性。

Jakarta EE(前身为 Java EE)是一个企业级 Java 平台标准,它整合了一系列经过 JCP 认证的 JSR 规范,为开发企业级应用提供一整套解决方案,包括但不限于 web 层、业务层、持久化层和消息传递等方面。Spring Framework 支持并集成了许多 Jakarta EE 中的关键技术规范,同时又提供了自己特有的编程模型和扩展功能。

Spring 编程模型并不包含 Jakarta EE 平台,而是从传统 Java EE 范围内精心选择的个别规范集成,包括:

  • Servlet API(JSR 340)
  • WebSocket API(JSR 356)
  • 并发工具(JSR 236)
  • JSON 绑定 API(JSR 367)
  • Bean 验证(JSR 303)
  • JPA(JSR 338)
  • JMS(JSR 914)
  • 用于事务协调的 JTA/JCA 设置

Spring 框架还支持依赖注入(JSR 330)和通用注解(JSR 250)规范,应用开发人员可以选择使用而不是 Spring 框架提供的特定机制。这也是程序员通常提到的基于注解开发的来源。因为实现了这些统一规范,Spring的兼容和功能都很强大。

最初这些JavaEE规范的实现都是放在 javax 包,也就是Spring Framework 5 以前的框架都是放在这个包路径。比如javax.servlet.http.HttpServletRequest就是实现的这个规范Servlet API(JSR 340)的一个类。

而在Spring Framework 6中,这个类的路径变成了Jakarta.servlet.http.HttpServletRequest。这更能说明Spring与Java EE的关系。

在现在的Springy应用中,Java/Jakarta EE 在应用程序开发中的角色已经发生了变化。在 J2EE 和 Spring 早期,应用程序被创建为部署到应用服务器上。

现在借助 Spring Boot,应用程序以 devops 和云友好的方式创建,内嵌了 Servlet 容器,易于更改。

截至 Spring Framework 5,WebFlux 应用程序可以不直接使用 Servlet API,可以在不是 Servlet 容器的服务器上运行(例如 Netty)。

Spring 是在不断创新和发展。需要集成对应的内容,只需要引入依赖修改版本即可。

Spring与Spring生态项目有版本的限制,比如Spring5对应Springboot2,而最新的Spring6则对应最新的Spring Boot 3。

以下通过使用jarkata的实现Bean 验证(JSR 303)这个规范的代码例子来说明Spring Framework是如何实现Bean 验证(JSR 303)的。

package io.yulin.learn.spring.s101;import jakarta.validation.ConstraintViolation;
import jakarta.validation.Validation;
import jakarta.validation.Validator;
import jakarta.validation.constraints.*;
import lombok.Data;import java.util.Set;/*** 演示使用jakarta ee 中的api* @author nine* @since 1.0*/
public class JakartaEE {public static void main(String[] args) {System.out.println("hello jakarta ee");UserReq userReq = new UserReq();userReq.setName("John Doe");userReq.setAge(180);
//        userReq.setEmail("john.doe@example.com");userReq.setSex("Male");Validator validator = Validation.buildDefaultValidatorFactory().getValidator();Set<ConstraintViolation<UserReq>> violations = validator.validate(userReq);if (violations.isEmpty()) {System.out.println("UserReq is valid");} else {for (ConstraintViolation<UserReq> violation : violations) {System.out.println(violation.getPropertyPath() + " " + violation.getMessage());}}}}@Data
class UserReq{@NotBlankprivate String name;@Max(value = 170, message = "年龄不能大于170岁")@Min(value = 1,message = "年龄不能小于1岁")private Integer age;@Email(message = "请输入邮箱格式")@NotEmptyprivate String email;@NotBlankprivate String sex;
}

通过输出可以发现,通过简单的注解+jarkata工具就可以验证输入的正确性。减少了非常多的ifelse的判断,大大降低了代码的复杂度。

email 不能为空
age 年龄不能大于170岁

对业务pojo的验证接口是这样的。实现整个验证过程的一个实现是org.hibernate.validator.internal.engine.ValidatorImpl#validateInContext。通过反射、解析注解等过程验证业务类。

	/*** 对对象上的所有约束进行验证。*/<T> Set<ConstraintViolation<T>> validate(T object, Class<?>... groups);

Java Specification Requests、Jakarta EE、Spring6 的关系

总的来说Spring是一个集大成者,既选择了部分Java Specification Requests,也选择了Jakarta EE。

  • JSRs 与 Jakarta EE 直接相关,因为 Jakarta EE 是由一系列 JSRs 组成的,它是按照 JSR 规范实现的企业级平台标准。
  • Spring Framework 与两者都有关联,因为它既支持和遵守了部分 Jakarta EE 中基于 JSR 的规范,又在此基础上发展了自己的技术和架构,提供了一套不完全依赖于 Jakarta EE 的完整应用框架。

它们三者的区别在于:

  • JSRs 是规范和标准层面的东西,它定义了技术接口和行为,而不提供具体的实现。
  • Jakarta EE 是一套遵循 JSRs 的企业级平台实现,提供了完整的软件栈和部署环境。
  • Spring Framework 则是一个独立于 Jakarta EE 规范之外的应用框架,虽然兼容并集成了许多 Jakarta EE 技术,但它的目标是在简化企业级应用开发的同时,提供更多自由度和灵活性。

三者之间的关系可以mermaid流程图表示:

实现
实现
开箱即用的
JSR
Jakarta_EE
Spring

Spring的设计原则

当学习一个框架时,重要的不仅是了解它能做什么,还有它遵循的原则。

以下是Spring Framework的指导原则(来自Spring Framework 的文档):

  • 在每个层面提供选择。Spring允许您尽可能推迟设计决策。例如,您可以通过配置在不更改代码的情况下切换持久性提供程序。对于许多其他基础设施问题和与第三方API集成也是如此。
  • 容纳多元化观点。Spring支持灵活性,不对应该如何完成事务持有固定看法。它支持各种不同观点的应用需求。
  • 保持强大的向后兼容性。Spring的演进经过精心管理,版本之间几乎没有重大变化。Spring支持一系列精心选择的JDK版本和第三方库,以便维护依赖于Spring的应用程序和库。
  • 关注API设计。Spring团队花费大量时间和精力制定直观且经得起时间考验的API。
  • 设定高标准的代码质量。Spring Framework非常重视有意义、当前且准确的javadoc。它是为数不多的几个项目之一,可以声称具有清晰的代码结构,在各个包之间没有循环依赖。

通过上述原则可以看到Spring之所以如此流行和强大,并不仅仅是因为开源。还因为它优秀的设计与实现。

与程序员的业务开发流程相对比,这也是一个很好的开发流程学习模板。通过良好的设计指导更加完美的实现,通过review闭环输出高质量的代码。

工程化的设计在开发者的代码和Spring6框架无处不在。通过对Spring的学习可以提升工程化开发的认知和技能。

关于作者

来自一线全栈程序员nine的八年探索与实践,持续迭代中。欢迎关注公众号“雨林寻北”或添加个人卫星codetrend(备注技术)。

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

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

相关文章

C语言经典算法-6

文章目录 其他经典例题跳转链接31.数字拆解32.得分排行33.选择、插入、气泡排序34.Shell 排序法 - 改良的插入排序35.Shaker 排序法 - 改良的气泡排序 其他经典例题跳转链接 C语言经典算法-1 1.汉若塔 2. 费式数列 3. 巴斯卡三角形 4. 三色棋 5. 老鼠走迷官&#xff08;一&…

Python图像处理指南:PIL与OpenCV的比较【第136篇—PIL】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python图像处理指南&#xff1a;PIL与OpenCV的比较 图像处理在计算机视觉和图像识别等领域…

【极简无废话】open3d可视化torch、numpy点云

建议直接看文档&#xff0c;很多都代码老了&#xff0c;注意把代码版本调整到你使用的open3d的版本&#xff1a; https://www.open3d.org/docs/release/tutorial/visualization/visualization.html 请注意open3d应该已经不支持centos了&#xff01; 从其他格式转换成open3d…

动手做简易版俄罗斯方块

导读&#xff1a;让我们了解如何处理形状的旋转、行的消除以及游戏结束条件等控制因素。 目录 准备工作 游戏设计概述 构建游戏窗口 游戏方块设计 游戏板面设计 游戏控制与逻辑 行消除和计分 判断游戏结束 界面美化和增强体验 看看游戏效果 准备工作 在开始编码之前…

Memcached-分布式内存对象缓存系统

目录 一、NoSQL 介绍 二、Memcached 1、Memcached 介绍 1.1 Memcached 概念 1.2 Memcached 特性 1.3 Memcached 和 Redis 区别 1.4 Memcached 工作机制 1.4.1 内存分配机制 1.4.2 懒惰期 Lazy Expiration 1.4.3 LRU&#xff08;最近最少使用算法&#xff09; 1.4.4…

【07】进阶html5

HTML5 包含两个部分的更新,分别是文档和web api 文档 HTML5 元素表 元素语义化 元素语义化是指每个 HTML 元素都代表着某种含义,在开发中应该根据元素含义选择元素 元素语义化的好处: 利于 SEO(搜索引擎优化)利于无障碍访问利于浏览器的插件分析网页新增元素 多媒体…

【C++干货基地】特殊函数名的函数:赋值运算符重载

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

OceanBase生产环境安装部署的最优实践

关于生产环境&#xff0c;为了尽量确保性能和稳定性&#xff0c;我们比较建议采用标准化的配置进行部署&#xff0c;例如接下来会提到的服务初始化、日志管理和数据分盘等关键步骤。而在非生产环境中&#xff0c;如果条件满足&#xff0c;同样建议遵循规范部署的原则。 前期准备…

SpringBoot如何写好单元测试

&#x1f413;序言 Spring中的单元测试非常方便&#xff0c;可以很方便地对Spring Bean进行测试&#xff0c;包括Controller、Service和Repository等Spring Bean进行测试&#xff0c;确保它们的功能正常&#xff0c;并且不会因为应用的其他变化而出现问题。 &#x1f413;单元测…

CSS问题精粹1

1.关于消除<li>列表前的符号 我相信很多人在初学CSS时会遇到该问题&#xff0c;无论是创作导航&#xff0c;还是列表&#xff0c;前面都会有个黑点点或其它符号。 解决该问题其实很简单 采用list-style-type:none或list-style:none直接解决 如果你想更换前面的黑点点&a…

进程的概念 | PCB | Linux下的task_struct | 父子进程和子进程

在讲进程之前首先就是需要去回顾一下我们之前学的操作系统是干嘛的&#xff0c;首先操作系统是一个软件&#xff0c;它是对上提供一个良好高效&#xff0c;稳定的环境的&#xff0c;这是相对于用户来说的&#xff0c;对下是为了进行更好的软硬件管理的&#xff0c;所以操作系统…

MySQL之索引与事务

一 索引的概念 一种帮助系统查找信息的数据 数据库索引 是一个排序的列表&#xff0c;存储着索引值和这个值所对应的物理地址无须对整个表进行扫描&#xff0c;通过物理地 址就可以找到所需数据是表中一列或者若干列值排序的方法 需要额外的磁盘空间 索引的作用 1 数据库…

浅谈RPC的理解

浅谈RPC的理解 前言RPC体系Dubbo架构最后 前言 本文中部分知识涉及Dubbo&#xff0c;需要对Dubbo有一定的理解&#xff0c;且对源码有一定了解 如果不了解&#xff0c;可以参考学习我之前的文章&#xff1a; 浅谈Spring整合Dubbo源码&#xff08;Service和Reference注解部分&am…

数字化战略失配企业现状,可惜了!

尽管大部分的企业领导者已经意识到数字化转型对于企业革新业务模式、提升运营效率、抢占市场先机的关键作用&#xff0c;但是&#xff0c;认知上的转变并不等同于成功的实践。在实际操作中&#xff0c;往往出现战略与企业现状不符的现象&#xff0c;这无疑会使得所有的努力付诸…

windows查看局域网内所有已使用的IP IP扫描工具 扫描网段下所有的IP Windows环境下

推荐使用&#xff1a; Advanced IP Scanner 官网下载&#xff1a; https://www.advanced-ip-scanner.com/

学习vue3第九节(新加指令 v-pre/v-once/v-memo/v-cloak )

1、v-pre 作用&#xff1a;防止编译器解析某个特定的元素及其内容&#xff0c;即v-pre 会跳过当前元素以及其子元素的vue语法解析&#xff0c;并将其保持原样输出&#xff1b; 用于&#xff1a;vue 中一些没有指令和插值表达式的节点的元素&#xff0c;使用 v-pre 可以提高 Vu…

LeetCode 17 / 100

目录 普通数组最大子数组和合并区间轮转数组除自身以外数组的乘积缺失的第一个正数 LeetCode 53. 最大子数组和 LeetCode 56. 合并区间 LeetCode 189. 轮转数组 LeetCode 238. 除自身以外数组的乘积 LeetCode 41. 缺失的第一个正数 普通数组 最大子数组和 给你一个整数数组 …

十、MySQL主从架构配置

目录 一、资源配置 二、主从同步基本原理&#xff1a; 1、具体步骤&#xff1a; 2、数据库是靠什么同步的&#xff1f; 3、pos与GTID的区别&#xff1f; 三、配置一主两从 &#xff08;1&#xff09;为主库和从库创建复制账户&#xff0c; 分别在主从库上执行如下命令&a…

React Native:跨平台移动应用开发的利器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Python进程与线程开发

目录 multiprocessing模块 线程的开发 threading模块 setDaemon 死锁 线程间的通信 multiprocessing模块 运行python的时候&#xff0c;我们都是在创建并运行一个进程&#xff0c;(linux中一个进程可以fork一个子进程&#xff0c;并让这个子进程exec另外一个程序)。在pyt…