Spring Version 5.3.12
本次翻译项目启动于 2021年10月11日,翻译内容掺杂个人理解,并非官方一板一眼翻译,因此若有不对的地方,可留言修改
概述
Spring的含义
Spring
通常代表Spring Framework
,但随着时间迁移,衍生出许多基于Spring Framework
的项目,所以现在的Spring
代表了Spring家族下的所有项目。由于此文档聚焦在Spring家族的基础:Spring Framework
,因此下面使用Spring
替代Spring Framework
。
Spring划分为多个模块,因此开发者根据情况可以按需引入。最核心的模块是Spring的容器,它包含了配置模型(Configuration Model)和DI(Dependecy Injection, 依赖注入)
机制。除此之外,Spring还为不同的应用架构提供了基础设施支持,例如:
-
消息 Messaging
-
事务 Transactional
-
持久化 persistence
-
web应用
-
基于
servlet
的Spring MVC Web
-
并行的
Spring Webflux Reactive Web
-
有关模块化的小Tips:
—— Spring 支持JDK9的模块化功能:Jigsaw
,对于启用了Jigsaw
的应用,Spring提供了稳定的模块名称:spring.core
、spring.context
等,采用的命名模式是将项目中的“-”
替换为“.”
。
Spring和Spring框架的历史
为了应对早期J2EE规范的复杂性,Spring于2003年诞生了。一些人认为J2EE和Spring之间是竞争关系,实际上,Spring是用来补充J2EE的。Spring本身并没有重新去实现J2EE规范,相反,它精心挑选了J2EE下的某些独立的规范,并对其进行了整合:
-
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(Java Transaction API) / JCA(Java Connector Architecture)
。
对于Spring某些自身独有的机制,如依赖注入相关的注解:@Autowired
。Spring也提供了其余选择供开发者按需使用,如:
对Spring 5 来说,最低要求是Java EE 7(Servlet 3.1+, JPA 2.1+)
。若当前运行环境是Java EE 8(Servlet 4.0, JSON Binding API)
,Spring依旧提供了开箱即用的支持。这使得Spring完全兼容Tomcat 8 / 9
,WebSphere 9
和JBoss EAP 7
。
可参考:Tomcat与Servlet版本关系
随着技术发展,Java EE 在目前应用开发中扮演的角色已经发生了变化。在早期的Java EE和Spring里,应用必须部署在某种Application Server(eg. Tomcat, Jetty)
中。如今,在Spring Boot的帮助下,应用基于devops
和cloud-friendly
的方式创建,并内置了Servlet容器,创建后不用做很大的修改即可运行。对于Spring 5而言,一个Webflux应用甚至无需使用Servlet API,并且可以运行在像Netty那样的非Servlet容器上。
同时,Spring家族也在不断的创新和发展。除了Spring 以外,还衍生了许多别的工程:
-
Spring Boot
-
Spring Security
-
Spring Data
-
Spring Cloud
-
Spring Batch
-
等等
需要记住的是,每一个项目都有其私有的源码仓库、issue追踪和发布情况,可以通过浏览以下网站获取完整的Spring项目列表:
https://spring.io/projects
设计理念
当学习某个框架时,最重要的是了解其遵循的“原则”,而非其实现的功能。以下是Spring 遵循的指导思想:
-
在应用架构的各层都提供了灵活的“选择”。Spring允许开发者尽可能拖延设计决策,例如在持久层选择了Mybatis进行开发,在项目后期如果想切换别的Persistence Providers,仅需要通过配置即可,无需修改项目代码。此选择同样适用于基础架构问题和整合的第三方API。
-
包容不同观点。Spring在拥抱灵活性的同时,并不会武断的要求事情应该如何去做。相反的是,对于应用需求上的不同观点(消息队列为例,可能有人觉得rabbitMQ好,可能有人觉得ActiveMQ好),Spring都提供的宽广的支持。
-
保持强大的向后兼容能力。Spring精心管理其演进过程,强制在不同版本间仅出现极少的重大改变。Spring支持一系列精心挑选的JDK和三方库版本,使得基于Spring构建的应用和库都可以轻松的维护。
-
精心设计API。为了使API可以更加简单直观使用,以及跨越多个版本使用,Spring团队花费很多时间和思考它的设计。
-
高质量代码标准。Spring十分重视有意义的、最新的、准确的Java Doc,同时Spring也是一个很优秀的项目,因为极少有项目可以清晰描述代码结构,且不同的包之间不存在循环依赖。
反馈和贡献
如果对Spring有任何操作、诊断、调试上的问题,我们建议先去Stack Overflow
上查询解决方案:
https://stackoverflow.com/questions/tagged/spring+or+spring-mvc+or+spring-aop
若你十分确定这是Spring框架上的问题,或你想对Spring提出一些特性建议,可以通过Github Issues
来记录:
https://github.com/spring-projects/spring-framework/issues
对于Spring某些已知问题,可以通过提交Pull Request
到Github
,来告知你的想法或你的修复建议。
https://github.com/spring-projects/spring-framework
更多有关此部分的内容可以阅读项目中的 CONTRIBUTING
文件:
https://github.com/spring-projects/spring-framework/blob/main/CONTRIBUTING.md
开始使用Spring
如果你是第一次开始使用Spring,那么推荐你创建基于Spring Boot的工程项目来了解Spring。Spring Boot提供了一种快速的(或者说是武断的)的方式来创建应用,此应用是基于Spring的,并且是产品级别的工程了。Spring Boot的核心思想是 “约定大于配置”,目的就是为了让开发者尽可能迅速的启动并运行项目。
这里所说的 “武断”,是指Spring Boot针对许多整合的API选择了一套默认的实现,而这些在传统的Spring应用中都是需要自己去配置指定的。所以说Spring is not opinionated,而Spring Boot is opinionated。
创建工程有两种方式:
-
可以通过下面的地址快速创建一个基础的工程:
https://start.spring.io/
-
也可以跟随Spring官方的指引文档来一步步创建,为了更好的消化Spring,这些指引以 “任务” 划分,并且大部分都是基于Spring Boot的,从而可以更好的上手。当你想解决某些特定的问题时,你也许想使用Spring家族里的其它项目,放心,此指引文档已经涵盖了这些项目。
https://spring.io/guides