题图 | Image by Freepik
摘要:在编程世界,代码耦合性高、复杂性大的问题一直折磨着所有开发人员。为了解决这个问题,程序员前仆后继开发出了各种框架。但是没有一个特别能打、且让大部分程序员拍手称快的框架诞生。直到有一位年轻但经验丰富的 Java 程序员 Rod Johnson 出现,他和团队开发的一种框架,触动了无数程序员,这就是 Spring。
2004 年的今天,首个稳定版 Spring 1.0 正式发布。今天是 Spring 1.0 发布 19 周年。而 Spring 的真正诞生是在 2003 年。2003年6月,Spring 0.9 首次以 Apache License 2.0 许可协议的形式发布,标志着 Spring 的正式诞生。自此,Spring 开启了在 IT 技术世界的打怪升级之旅,也缔造了自己在 Java 生态领域持续 20 年的神话。
据估计,全球超过 50% 的企业使用 Spring 框架进行 Java 开发。2021年的一项调查显示,超过 86% 的 Java 程序员在日常开发工作中离不开 Spring。加之 Spring 社区的活跃程度,很容易看出其在全球范围内具有广泛的用户基础和影响力。
今年是 Spring 诞生的第 20 个年头。此刻,向 Spring 及 Spring 开发者(≈ Java 开发者)致敬,祝 Spring 的神话可以再续 N 个 20 年!
同时,也借这个特殊的日子,让我们忆往昔,看看林林总总的 Spring 发展之旅;展未来,期待 Spring 在智能时代再创辉煌,助力开发者在技术领域探索中挑战无限可能。
```java
@RestController
public class GreetingController {
@Autowired
private GreetingRepository greetingRepository;
@GetMapping("/greetings")
public List getAllGreetings() {
return greetingRepository.findAll();
}
@PostMapping("/greetings")
public Greeting addGreeting(@RequestBody Greeting greeting) {
return greetingRepository.save(greeting);
}
}
@Entity
public class Greeting implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@NotNull
private String message;
protected Greeting() {
}
public Greeting(String message) {
this.message = message;
}
// getters and setters
}
public interface GreetingRepository extends JpaRepository {
}
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
```
注:基于 Spring Boot 的 Web 应用程序的代码,祝 Spring 20周年生日快乐。该示例使用了 Spring 框架的各种特性和库,包括 Spring MVC、Spring Data JPA 和 Thymeleaf,演示了 Spring 框架的简单易用(by ChatGPT,From AI 对话未来)
引言
2002 年,Rod Johnson 写了一本名为 Expert one-on-one J2EE Design and Development 的书,书中对 J2EE 当时存在的各种问题进行了深入剖析,还提出了一套解决方案的雏形。2003年6月,Spring 0.9 首次以 Apache License 2.0 许可协议的形式发布,标志着 Spring 的正式诞生。2004年3月24日,首个稳定版 Spring 1.0 正式发布。同年 6月,Rod Johnson 出版了Expert one-on-one J2EE Development without EJB,详细说明了如何使用 Spring 高效解决企业级应用的核心问题。这两本书可以算得上 Spring 世界的倚天屠龙了。
自此,Spring 开启了在 IT 技术世界的打怪升级之旅,也缔造了自己在 Java 生态持续 20 年的神话。
20 年,面对技术世界的日新月异,Spring 开发者真正做到了不断地探索与发现,突破与创新,共同构建了强大的技术生态系统。
一、Spring 里程碑事件
2003年6月,Spring 0.9 首次以 Apache License 2.0 许可协议的形式发布。
2004年3月24日,首个稳定版 Spring 1.0 正式发布。
2005年,Spring Framework 1.2 发布,引入了 AspectJ AOP 和 JDBC 抽象层等特性。
2006年,Spring Framework 2.0 发布,引入了基于注解的配置方式和支持Java 5 语法的特性。
2009年,Spring Framework 3.0 发布,引入了基于 Java 5 的泛型和面向切面编程等特性。
2013年,Spring Framework 4.0 发布,引入了对 Java 8 特性的支持和WebSocket 等新特性。
2014年,Spring Boot 发布。它的出现完全颠覆了应用程序框架开发的传统方式,提供了快速开发、自动配置和无须 XML 配置的特性,极大地简化了开发人员的工作。
2015年,Spring Cloud Netflix 1.0 发布,该版本基于 Netflix 的一些组件,实现了负载均衡、熔断器、断路器等一系列服务治理相关的功能。在云计算已成为标配的大背景下,Spring Cloud 应运而生,为开发云原生 Java 应用提供了很好的支持。
2017年,Spring Framework 5.0 发布,引入了对 Reactive 编程模型的支持和 Spring WebFlux 等新特性。2018年,Spring Framework 5.1 发布,引入了 Kotlin 语言以及 Java 11 的完全支持。2020年,Spring Framework 5.2 发布,引入了很多新特性,如支持 Null Safety、提升性能、引入方法参数注释,等等。
2022年11月16日,Spring Framework 6.0 发布,采用 JDK17 以上的版本,迁移到了 Jakarta EE 9+,并支持最新的 Web 容器,包括 Tomcat 10 / Jetty 11。
Spring 官方 logo
在国内,开发者们也紧跟行业的步伐,持续关注 Spring Framework 的发展。一群对技术充满热情的人创建了Spring中文用户组,翻译了Spring Framework 1.x 的官方文档和 Rod Johnson 的“Introduction to the Spring Framework” 等材料。满江红技术社区与 Spring 官方取得了联系,连续翻译了 Spring Framework 2.0 与 2.5 两个版本的官方文档。此外,满江红还在2006 年翻译出版了 Pro Spring 中文版《Spring专业开发指南》。在知名技术论坛 JavaEye 上,也有很多热烈讨论 Java EE 与 Spring Framework 的内容,甚至不乏开发者之间激烈的论战;前文中提到的《Expert one-on-one J2EE Development without EJB中文版》也是由 JavaEye 论坛的几位成员一同翻译的。正是大家的这些努力,对 Spring Framework 在国内的发展起到了极大的推动作用。
Spring 在中国的发展历程中也有许多重要的里程碑事件,以下是其中几个。
2004年前后,一群对技术充满热情的人创建了 Spring 中文用户组和满江红开放技术社区。
2007年,Spring中文社区在中国成立,成为了中国Spring技术官方社区。
2007年,SpringI/O 首次亮相中国:SpringI/O 是 Spring 官方主办的年度开发者大会,2007年,SpringI/O 首次来到中国,为中国的 Java 开发者提供了学习和交流的机会。
2016年,Pivotal 公司宣布成立中国区总部,并推出 Spring Cloud 中国版。
2019年,Spring Cloud Alibaba 宣布正式发布:Spring Cloud Alibaba 阿里巴巴和 Spring 社区合作开发的分布式微服务框架,它为中国的企业级应用程序开发者提供了更加专业的解决方案。
三、Spring 名称的由来
传说 Rod Johnson 在写 Spring 时经常向自然界寻找灵感,他发现春天的到来是新的开始,万物复苏,生机勃勃。因此,他将框架取名为 Spring,希望新的框架能像春天一样给大家带来新的起点和无限生机,同时也象征着 Spring 革新了旧技术的局面。当然,上述只是传说,实际情况可能是 Rod 和小伙伴在开发框架的过程中向社区征集名称,有人提议 Spring,团队也迅速 Get了其中蕴含的上述意思,于是 Spring 诞生了。
四、Rod Johnson 其人
了不起的程序员、成功的创业家/企业家、开源社区活跃者。Spring 框架的创始人和主要贡献者之一,在 Spring 的诞生、成熟、运营推广等方方面面起到了巨大的作用。
2004年,Rod 与朋友共同创建了一家名为 Interface21 的咨询公司,这也是 Spring 公司的前身。
从 2002年开始,Rod 先后出版《Expert One-on-One J2EE Development without EJB》等多本图书,对 J2EE 存在的各种问题进行了深入剖析,提出了 Spring 框架作为解决方案。在随后的多年,致力于推动 Spring 成为业界最流行的企业级 Java 框架,并对 J2EE 技术生态做出了重大贡献。
除了对 Spring 的重大贡献以外,Rod 还是一名优秀的创业家和企业家。2012年,Rod 离开 Spring 公司,之后参与了多家公司的运营,他是 Neo Technology/Atomist/Meteor/Hazelcast 四家公司的董事,在公开演讲和各类媒体上也拥有广泛的影响力。Rod 一直支持开源开发和社区合作,也因此得到了许多开发者们的喜爱和尊敬。
五、Spring 背后的公司
2004年,Rod Johnson 等人成立 Interface21,目标是为企业应用程序提供更好的开发方式。
2008年,Interface21 更名为 SpringSource,后又更名为 Spring。
2009年8月,Spring 公司被 VMware 收购,并成为其子公司。通过 VMware 的支持,Spring公司发展得更加迅速,推出了许多新产品,例如 Spring Android、Spring Web Flow 等。
2013年,VMware 和母公司 EMC 合资成立 Pivotal Software,Spring 公司也并入其中。在 Pivotal Software 公司下,Spring 框架的发展得到了更多的资源和支持,并不断拓展其生态系统,推出了 Spring Boot、Spring Cloud 等重要的子项目。
2019年,Pivotal Software 公司被 VMware 再次收购,成为其子公司。此后,Spring 框架的发展依然继续,并在全球范围内得到了越来越广泛的应用。值得一提的是,随着云原生的兴起,Spring 框架及其生态系统也在不断地拓展云原生方向的发展。
Spring Framework 的发展是与整个Java 技术生态的发展紧密相连的。在 Spring Framework 诞生之前,Java 社区还没有一个像样的轻量级应用程序框架,开发者们需要在大量的 Servlet、JSP 和 EJB 代码中摸索和开发应用程序。Spring Framework 的出现彻底改变了这一局面,它提供了一个基于 POJO(普通 Java 对象)的编程模型,把应用程序的业务逻辑与底层技术解耦开来,使得开发者们可以更加自由、灵活地处理代码。Spring Framework 的优秀设计思想也为今后许多其他 Java 框架的发展奠定了基础。
在 Spring Framework 发展的同时,整个 Java 技术生态也在不断发展。随着 Java EE 平台的逐渐成熟和完善,Java 技术逐渐在企业级开发中占据主导地位。同时,Java 技术也从最初的 Web 开发领域开始向其他领域扩张,例如移动应用、大数据等。在这个过程中,Spring 看到了机会和挑战,始终处于技术的前沿和创新。
在 Java 企业级应用领域,Spring 和 Java EE 平台一起推动了整个领域的发展。Spring 提供了更加灵活和易于使用的开发模型,在一定程度上弥补了 Java EE 平台的不足;而 Java EE 平台则为 Spring 的发展提供了基础和支持。两者共同发力,使得 Java 企业级应用领域的整个阵容更加完善和强大。
除了企业级应用领域,Spring 还在其他领域取得了不俗的成绩。例如,在移动应用领域,Spring 为移动应用提供了后端支持和解决方案;在大数据领域,Spring 也推出了一系列的解决方案,例如 Spring Batch 和 Spring Hadoop 等。
总起来,Spring Framework 的出现和发展,推动了整个 Java 技术生态的进步和发展,并展示出了 Java 生态圈内的创新和活力。
附一:Spring 家族核心成员简介
注:早期的 Spring 仅指代 Spring Framework,后来基于 Spring Framework 孵化出了大量的项目,Spring 的含义变成了指代 Spring 家族。为了避免理解上的歧义,下文按后者进行表述,不会将 Spring Framework 或其他任何特定项目缩写为 Spring。【摘自兔子书《学透Spring》】
Spring 家族早期就只有少数几个围绕 Spring Framework 的项目。随着各种功能的不断演进,很多模块从 Spring Framework 中脱离出来以独立项目的形式发展,也有些项目从一开始就是在 Spring Framework 的基础上单独开发的。为了让大家能对 Spring 家族的项目有个大概的印象,下面我们先简单介绍一下家族中的几个主要成员。
1. Spring Framework
首先要介绍的当然是 Spring 家族中的第一位成员——Spring Framework,它为现代 Java 企业应用提供了一整套完整的开发与配置模型。正如前文所述,它的出现改变了 Java EE 项目的开发方式。
Spring Framework 的功能非常丰富,除了核心的依赖注入、AOP、资源管理等特性,还有完善的数据访问能力,在事务管理、ORM 框架支持等方面都有不错的表现。在 Web 开发方面,Spring MVC 早已取代了 SSH 组合中的 Struts,成为 Java Web 的主流框架;Spring Framework 5 推出的响应式 Web 框架 Spring WebFlux 也逐步崭露头角。除此之外,Spring Framework 中还有很多非常实用的功能,例如调度任务支持、缓存抽象等。
Spring Framework 的成功与其设计哲学密不可分。在基于 Spring Framework开发的项目中,开发者拥有很高的灵活度,框架为多种相似功能的第三方组件提供了一致的抽象,选择 Hibernate 还是 MyBatis 真的不是个大问题。Spring Framework 的开发团队对代码质量的要求相当严苛,不仅在 API 的设计上追求精益求精,就连源码生成出来的 JavaDoc 文档读起来都令人赏心悦目。
Spring Framework 总是紧跟技术发展,开发者社区也很活跃,所支持的 JDK 和组件一直在升级,每 3~4 年左右会有个重大版本的发布。在本书编写时,当前的主要版本是 5.3.x,而新一代的 6.0 版本也已经发布了 SNAPSHOT,各主要版本的信息如表1-1 所示。Spring Framework 各版本之间的兼容性还是比较好的,特别是核心的那些功能,几乎可以说在升级时能无缝平移。但升级也不是没有代价——抛开依赖的各种库的版本变化,框架自己的一些配置默认值有可能变化,有些功能可能会被淘汰。因此,如果你进行了版本升级,尤其是大版本升级,最好对系统做一轮完整的回归测试。
以升级到 6.0.0 为例,由于对 Java EE 的支持整体升级到了 Jakarta EE 9,很多注解和类的包名发生了变化。像 @Inject、@PostConstruct 和 @PreDestroy 都放到了 jakarta 包下,但框架还能兼容javax包里的注解;不过数据访问层 javax.persistence 里的东西就没办法兼容了,需要调整代码,使用 jakarta.persistence 中的对应内容。此外,也要注意 Maven 中的依赖,各种组件需要替换为带有 -jakarta 后缀的。虽然看起来有点麻烦,但对比 Python 2.x 升级 Python 3.x,这已经很幸福了。
Spring Framework 是 Spring 家族所有成员的基础。各位想要学透 Spring,就必须要掌握 Spring Framework 的核心要点和开发实践。
2. Spring Boot
如果说 Spring Framework 提升了 Java EE 项目的开发体验,那么 Spring Boot 则降低了开发生产级 Spring 应用的门槛。只需轻松几步就能构建一个可以投产的应用,其中包含了健康检查、监控、度量指标、外化配置等生产所需的功能。
Spring Boot 提供的起步依赖(starter dependency)很好地解决了 Spring 应用的依赖管理困境——按功能组织依赖,降低了开发者的心智负担。此外, Spring Boot 的依赖经过了严格的兼容性测试,开发者再也不用为到底该加什么依赖而犯愁了。
Spring Boot 的另一大亮点是自动配置。该功能减少了 Spring 应用的配置量,极端情况下甚至可以做到零配置。Spring Boot 可以根据多种条件自动判断是否需要做相应的配置,开发者也可以自行进行微调。Spring 团队曾开发过一个名为 Spring Roo 的项目,其目的就是帮助开发者生成所需的代码和配置。有一次与 Spring 团队的 Josh Long 聊到自动配置,他说:“如果一段配置可以生成,那为什么还要让开发者来配置呢?”相信这也是 Spring Boot 自动配置功能背后的哲学。
与 Spring Framework 类似,Spring Boot 的开发也很活跃,并且遵循一定的发布周期:大概每 6 个月会有一个版本发布,期间如有需要会安排发布相关的补丁版本。大版本通常会支持3年以上的时间,小版本则会提供至少 12 个月的支持。在 Spring Boot 2.4.0 之前,版本都带后缀,例如 2.3.5.RELEASE;从 2.4.0 版本开始,版本直接就是 2.4.0。在本书编写时,当前版本为 2.6.x,而 2.7.x 和 3.0.0 的 Spring Boot 已经发布了 SNAPSHOT,表1-2 罗列了 Spring Boot 各主要版本的一些信息。
3. Spring Cloud
随着云计算、微服务等概念的普及,大量应用程序逐步从单体应用发展到了分布式系统,但开发一套分布式系统又谈何容易。大公司有庞大的基础设施团队维护各种中间件,提供各种底层支持,让业务团队能聚焦在业务逻辑上,不用操心基础的分布式系统能力;小公司往往没有大公司的资源,需要自己在各种设施上摸爬滚打,各种踩坑。现在有了 Spring Cloud,一切又都变得简单了,无论是谁都可以站在巨人的肩膀上,用简单的代码就可以实现高可靠的分布式系统。
Spring Cloud 构建在 Spring Boot 提供的各种功能之上,例如用到了起步依赖与自动配置。两者在实践中会有一些对应关系,为了避免出现一些兼容性的问题,官方也给出了一个推荐的版本指南。早期的 Spring Cloud 采用伦敦的地铁车站作为 Release Train号,按字母序从前往后排列;但这的确不便于记忆,所以后来又增加了年份加数字的方式。表1-3罗列了最近几个 Spring Cloud 版本对应的 Spring Boot 版本。
Spring Cloud 并不是一个模块,而是一系列模块的集合,它们分别实现了服务发现、配置管理、服务路由、服务熔断、链路追踪等具体的功能。早期的 Spring Cloud 大量借鉴并引入了Netflix的最佳实践,Spring Cloud Netflix 就是基于 Netflix 的开源设施进行开发的。随后,在 Spring Cloud 的统一编程模型下,也出现了 Spring Cloud Zookeeper、Spring Cloud Consul 等基于流行开源设施的模块,并在这些设施之上提供服务发现、服务配置等功能。
表1-4 为大家筛选了一些主要的 Spring Cloud 子模块并加以简单说明(按字母序排序)。各子模块都有自己的独立版本,因此各模块版本的 EOL 等信息,可以在官网各模块的 SUPPORT 板块里查看。
4. Spring Data
Spring Framework 为传统的关系型数据库操作提供了统一的抽象,无论是事务管理还是数据访问模板,使用起来都让人得心应手。随着数据库技术的不断发展,涌现了大量的新技术和新产品,如果把对它们的支持都放入 Spring Framework 中,会导致框架十分臃肿,于是就有了 Spring Data。
Spring Data 与 Spring Cloud 一样包含了相当多的子模块,其中的内容非常丰富,囊括了 JDBC 增强功能、JPA 支持、不同类型的 NoSQL 支持以及对 REST 资源的支持。虽然底层的数据库种类繁多,但 Spring Data 还是在此之上提供了诸如仓库(Repository)和模板(Template)这样的统一抽象,确保了 RDBMS、Redis、MongoDB 等数据库的操作都具有相似的编程模型。
表1-5 为大家筛选了一些主要的 Spring Data 子模块并加以简单说明(按字母序排序),其中有些是 Spring 官方提供的,有些则是由社区维护的。
附二、Spring 图书推荐
Spring 是每个 Java 程序员都避不开的核心知识,如果你还在寻找入门与上手实战项目的 Spring 资料,那么向你推荐我(丁雪丰)最近出版的这本兔子书。
本书一经上市,就成为最受读者欢迎的 Spring 图书,希望跟着贯穿全书的二进制奶茶店大型案例,大家能通过兔子书解决落地项目难的问题。
超力度折扣,叠加满 300 减 50
赠 书 活 动
你是哪一年开始接触 Spring 的?Spring 多年来持续强劲的发展是否对你产生过实实在在的影响?结合个人的技术发展之路,聊聊 Spring 这款老当益壮的框架,评论区精选 5 位读者,获得精美赠书——图灵 Java 图书任选一本。截止:4 月 1 日零点。
扩展阅读
丁雪丰:我的新书出版了!推荐给Java程序员(可点)
Spring官方大佬推荐,Spring实战必备(可点)
三年等来兔子书!一次性打包学透 Spring(可点)