# Spring 框架概述

Spring 使创建 Java Enterprise 应用程序变得容易。它提供了在 Enterprise 环境中接受 Java 语言所需的一切，支持 Groovy 和 Kotlin 作为 JVM 上的替代语言，并具有根据应用程序的需求创建多种架构的灵活性。在 Spring Framework5.1 中， Spring 需要 JDK8+（Java SE8+）并为 JDK11LTS 提供开箱即用的支持。Java SE8Update60 被建议作为 Java8 的最低补丁版本，但通常建议使用最近发布的补丁。

Spring 支持广泛的应用场景。在大型 Enterprise 中，应用程序通常存在很长一段时间，并且必须在 JDK 和应用程序服务器上运行，其升级周期超出了开发人员的控制范围。其他的可能作为一个单独的服务器运行 jar，嵌入式服务器，可能是在云环境中。还有一些可能是不需要服务器的独立应用程序（例如批处理或集成工作负载）。

Spring 是开源的。它拥有一个庞大而活跃的社区，可以根据各种不同的实际用例提供持续的反馈。这在很长一段时间内帮助了 Spring 成功的进化。

## 1. 我们所说的“ Spring”是什么意思？

术语“ Spring”在不同的上下文中表示不同的事物。它可以用来指 Spring 框架项目本身，这就是它开始的地方。随着时间的推移，其他 Spring 个项目已经建立在 Spring 个框架之上。大多数情况下，当人们说“ Spring”时，他们指的是整个项目家族。这篇参考文献关注的是基础： Spring 框架本身。

Spring 框架被划分为多个模块。应用程序可以选择他们需要的模块。核心是核心容器的模块，包括配置模型和依赖注入机制。除此之外， Spring 框架还为不同的应用程序架构提供了基础支持，包括消息传递、事务数据和持久性以及 Web。它还包括基于 Servlet 的 Spring MVC Web 框架，以及并行的 Spring WebFlux 反应性 Web 框架。

关于模块的说明： Spring 的框架 JAR 允许部署到 JDK9 的模块路径（“Jigsaw”）。为了在支持拼图的应用程序中使用， Spring Framework5JAR 附带了“automatic-module-name”清单条目，这些条目定义了独立于 jar 工件名称的稳定语言级别的模块名称（“ Spring.core”、“ Spring.context”等）（这些 JAR 遵循与“-”而不是“.”相同的命名模式，例如“ Spring-core”和“ Spring-context”）。当然， Spring 的框架 JAR 在 JDK8 和 9+ 上的 Classpath 上运行良好。

## 2. Spring 和 Spring 框架的历史

Spring 作为对早期[J2EE](https://en.wikipedia.org/wiki/Java_Platform,_Enterprise_Edition)规范的复杂性的响应，于 2003 年出现。虽然有些人认为 Java EE 和 Spring 是竞争关系，但 Spring 实际上是对 Java EE 的补充。 Spring 编程模型不包含 Java EE 平台规范；相反，它集成了从 EE 系统中精心选择的各个规范：

* Servlet API（[JSR 340](https://jcp.org/en/jsr/detail?id=340)）

* WebSocket API（[JSR 356](https://www.jcp.org/en/jsr/detail?id=356)）

* 并发实用程序（[JSR 236](https://www.jcp.org/en/jsr/detail?id=236)）

* JSON 绑定 API（[JSR 367](https://jcp.org/en/jsr/detail?id=367)）

* Bean 验证（[JSR 303](https://jcp.org/en/jsr/detail?id=303)）

* JPA（[JSR 338](https://jcp.org/en/jsr/detail?id=338)）

* JMS（[JSR 914](https://jcp.org/en/jsr/detail?id=914)）

* 以及用于事务协调的 JTA/JCA 设置（如果有必要）。

Spring 框架还支持依赖注入（[JSR 330](https://www.jcp.org/en/jsr/detail?id=330)）和公共注释（[JSR 250](https://jcp.org/en/jsr/detail?id=250)）规范，应用程序开发人员可以选择使用这些规范，而不是 Spring 框架提供的 Spring 特定机制。

在 Spring Framework5.0 中， Spring 至少需要 Java EE7 级别（例如 Servlet 3.1+， JPA 2.1+），同时在运行时遇到 Java EE8 级别的较新 API（例如 Servlet 4.0，JSON Binding API）时提供开箱即用的集成。这使得 Spring 完全兼容例如 Tomcat 8 和 9、WebSphere9 和 JBossEAP7。

随着时间的推移，Java EE 在应用程序开发中的角色已经发生了变化。在 Java EE 和 Spring 的早期，创建应用程序是为了将其部署到应用程序服务器上。今天，在 Spring Boot 的帮助下，应用程序是以 DevOps 和云友好的方式创建的， Servlet 容器是嵌入式的，需要进行更改。在 Spring Framework5 中，WebFlux 应用程序甚至不直接使用 Servlet API，并且可以在不是 Servlet 容器的服务器（例如 Netty）上运行。

Spring 继续创新和发展。在 Spring 框架之外，还有其他项目，例如 Spring 引导、 Spring 安全、 Spring 数据、 Spring 云、 Spring 批处理等。重要的是要记住，每个项目都有自己的源代码存储库、问题跟踪器和发布 Cadence。有关 Spring 项目的完整列表，请参见[spring.io/projects](https://spring.io/projects)。

## 3. 设计哲学

当你了解一个框架时，重要的是不仅要知道它做了什么，还要知道它遵循了什么原则。以下是 Spring 框架的指导原则：

* 在各个层面提供选择。 Spring 让你尽可能推迟设计决策。例如，你可以在不更改代码的情况下通过配置切换持久性提供程序。对于许多其他基础设施问题以及与第三方 API 的集成，也是如此。

* 容纳不同的视角。 Spring 支持灵活性，对事情应该如何做并不固执己见。它以不同的视角支持广泛的应用需求。

* 保持强大的向后兼容性。 Spring 的演变过程得到了谨慎的管理，几乎没有在不同版本之间发生任何突破性的变化。 Spring 支持精心选择的一系列 JDK 版本和第三方库，以便于维护依赖于 Spring 的应用程序和库。

* 关心 API 设计。 Spring 团队投入了大量的思想和时间来制作直观的 API，并且可以在许多版本和许多年中使用。

* 为代码质量设定高标准。 Spring 框架非常强调有意义的、当前的和准确的 Javadoc。它是极少数几个可以声称没有包之间循环依赖的干净代码结构的项目之一。

## 4. 反馈和贡献

对于操作问题或诊断或调试问题，我们建议使用堆栈溢出。单击[here](https://stackoverflow.com/questions/tagged/spring+or+spring-mvc+or+spring-aop+or+spring-jdbc+or+spring-r2dbc+or+spring-transactions+or+spring-annotations+or+spring-jms+or+spring-el+or+spring-test+or+spring+or+spring-remoting+or+spring-orm+or+spring-jmx+or+spring-cache+or+spring-webflux+or+spring-rsocket?tab=Newest)以获得在堆栈溢出上使用的建议标记列表。如果你相当确定 Spring 框架中存在问题，或者想推荐一个功能，请使用[GitHub 问题](https://github.com/spring-projects/spring-framework/issues)。

如果你有一个解决方案或建议的修补程序，你可以在[Github](https://github.com/spring-projects/spring-framework)上提交一个拉请求。但是，请记住，对于所有的问题，除了最琐碎的问题，我们希望在问题追踪器中归档一张票，在那里进行讨论，并留下一个记录供将来参考。

有关更多详细信息，请参见[CONTRIBUTING](https://github.com/spring-projects/spring-framework/tree/main/CONTRIBUTING.md)顶层项目页面中的指南。

## 5. 开始

如果你刚刚开始使用 Spring，那么你可能希望通过创建一个基于[Spring Boot](https://projects.spring.io/spring-boot/)的应用程序来开始使用 Spring 框架。 Spring Boot 提供了一种快速的（且自以为是的）方法来创建基于 Spring 的可生产应用程序。它基于 Spring 框架，更倾向于约定而不是配置，并且旨在让你尽快启动和运行。

你可以使用[start.spring.io](https://start.spring.io/)来生成一个基本项目，或者遵循[“入门”指南](https://spring.io/guides)中的一个，例如[开始构建 RESTful Web 服务](https://spring.io/guides/gs/rest-service/)。除了更容易理解之外，这些指南还非常注重任务，并且大多数指南都是基于 Spring 引导的。它们还涵盖了 Spring 投资组合中你在解决特定问题时可能要考虑的其他项目。
