Spring Framework 概述
Version 6.0.0-M6
Spring 使创建 Java 企业应用程序变得容易。它提供了在企业环境中采用 Java 语言所需的一切,支持将 Groovy
和 Kotlin
作为 JVM
上的替代语言,并且可以根据应用程序的需求灵活地创建多种架构。从 Spring Framework 5.1 开始,Spring 需要 JDK 8+ (Java SE 8+) 并为 JDK 11 LTS 提供开箱即用的支持。建议 Java SE 8 update 60 作为 Java 8 的最低补丁版本,但通常建议使用最近的补丁版本。
Spring 支持广泛的应用场景。在大型企业中,应用程序往往存在很长时间,并且必须运行在 JDK 和应用服务器上,其升级周期超出了开发人员的控制范围。其他的可能作为嵌入服务器的单个 jar 运行,可能在云环境中。还有一些可能是不需要服务器的独立应用程序(例如批处理或集成工作负载)。
Spring 是开源的。它拥有一个庞大而活跃的社区,可以根据各种实际用例提供持续的反馈。这帮助 Spring 在很长一段时间内成功发展。
1. 我们所说的 Spring 是什么意思?
“Spring”一词在不同的上下文中意味着不同的事物。它可以用来指代 Spring Framework 项目本身,这就是一切的开始。随着时间的推移,其他 Spring 项目已经建立在 Spring Framework 之上。大多数情况下,当人们说“Spring”时,他们指的是整个项目系列。本参考文档侧重于基础:Spring Framework 本身。
Spring Framework 拆分成模块。应用程序可以选择他们需要的模块。这些模块中的核销是核心容器(core container),包括配置模型(configuration model)和依赖注入机制(dependency injection mechanism)。除此之外,Spring Framework 还为不同的应用程序架构提供了基础支持,包括消息传递、事务数据和持久性以及 Web。它还包括基于 Servlet 的 Spring MVC Web 框架,以及并行的 Spring WebFlux 响应式 Web 框架。
关于模块的提示:Spring Framework 的 jars 允许部署到 JDK 9 的模块路径(“Jigsaw”)上。为了在支持 Jigsaw 的应用程序中使用,Spring Framework 5 jars 带有“Automatic-Module-Name”清单条目,这些条目定义了稳定的语言级模块名称(“spring.core”、“spring.context”等等)不同于 jar 工件(jar artifact)名称(jar 遵循相同的命名模式,使用“-”而不是“.”,例如“spring-core”和“spring-context”)。当然,Spring Framework 的 jars 在 JDK 8 和 9+ 上的类路径上都能正常工作。
2. Spring 和 Spring Framework 的历史
Spring 诞生于 2003 年,以应对早期 J2EE 规范的复杂性。虽然有些人认为 Java EE
及其现代继承者 Jakarta EE
与 Spring 是竞争关系,但它们实际上是互补的。Spring 编程模型不包含 Jakarta EE 平台规范;相反,它集成了从传统 EE 保护伞中精心挑选的各个规格:
- Servlet API (JSR 340)
- WebSocket API (JSR 356)
- Concurrency Utilities (JSR 236)
- JSON Binding API (JSR 367)
- Bean Validation (JSR 303)
- JPA (JSR 338)
- JMS (JSR 914)
- 以及用于事务协调的 JTA/JCA 设置(如有必要)
Spring Framework 还支持 Dependency Injection (JSR 330) 和 Common Annotations (JSR 250) 规范,因此应用程序开发人员可以选择使用它们来代替 Spring Framework 提供的特定于 Spring 的机制。最初,它们基于常见的 javax
包。
从 Spring Framework 6.0 开始,Spring 已经升级到 Jakarta EE 9 级别(例如 Servlet 5.0+、JPA 3.0+),基于 jakarta
命名空间而不是传统的 javax
包。以 EE 9 为最低要求,一旦正式发布,Spring 准备为 EE 10+ 中的 API 进一步推进提供开箱即用的支持。这使得 Spring Framework 6 与Tomcat 10+ 和 Jetty 11+完全兼容。
随着时间的推移,Java/Jakarta EE 在应用程序开发中的作用发生了变化。在 J2EE 和 Spring 的早期,创建应用程序是为了部署到应用程序服务器。今天,在 Spring Boot 的帮助下,应用程序以一种对开发者和云友好的方式创建,比如嵌入了 Servlet 容器并且易于更改。从 Spring Framework 5 开始,WebFlux 应用程序甚至不直接使用 Servlet API,并且可以在不是 Servlet 容器的服务器(例如 Netty)上运行。
Spring 不断创新和发展。除了 Spring Framework,还有其他项目,例如 Spring Boot、Spring Security、Spring Data、Spring Cloud、Spring Batch 等等。这是很重要的,一定要记住,每个项目都有自己的源码库、问题跟踪器和发布节奏。有关 Spring 项目的完整列表,请参阅 spring.io/projects。
3. 设计理念
当你了解一个框架时,重要的是不仅要知道它做了什么,而且要知道它遵循什么原则。以下是 Spring Framework 的指导原则:
- 提供每个级别的选择。Spring 允许您尽可能晚地推迟设计决策。例如,您可以通过配置切换持久化,而无需更改代码。许多其他基础设施问题以及与第三方 API 的集成也是如此。
- 容纳不同的观点。Spring 拥抱灵活性,并且不会对事情应该如何做固执己见。它以不同的视角支持广泛的应用需求。
- 保持强大的向后兼容性。Spring 的演变经过精心管理,在版本之间几乎没有发生重大变化。Spring 支持精心挑选的一系列 JDK 版本和第三方库,以方便维护依赖于 Spring 的应用程序和库。
- 关心 API 设计。Spring 团队投入大量精力和时间来制作直观且可跨多个版本和多年使用的 API。
- 为代码质量设定高标准。Spring 框架非常强调有意义的、最新的和准确的 javadoc。它是极少数可以声称代码结构清晰且包之间没有循环依赖关系的项目之一。
4. 反馈和贡献
对于提问、诊断或调试问题,我们建议使用 Stack Overflow。单击 此处 获取在 Stack Overflow 上使用的建议标签列表。如果您相当确定 Spring 框架中存在问题或想要建议某个功能,请使用 GitHub Issues。
如果您有解决方案或建议的修复,您可以在 Github 上提交拉取请求。 但是,请记住,除了最琐碎的问题之外,我们希望在问题跟踪器中提交一张票,在那里进行讨论并留下记录以供将来参考。
有关更多详细信息,请参阅顶级项目页面上的 CONTRIBUTING 指南。
5. 快速入门
如果您刚刚开始使用 Spring,您可能希望通过创建基于 Spring Boot 的应用程序来开始使用 Spring Framework。Spring Boot 提供了一种快速(自认为)的方式来创建可用于生产的基于 Spring 的应用程序。它基于 Spring Framework,支持约定优于配置,旨在让您尽快启动和运行。
您可以使用 start.spring.io 生成基本项目或遵循“入门”指南创建,例如入门构建 RESTful Web 服务。除了更容易理解之外,这些指南还非常注重任务,其中大部分都基于 Spring Boot。它们还涵盖了 Spring 产品组合中的其他项目,您在解决特定问题时可能需要考虑这些项目。