Spring Boot 产⽣生的背景和它的设计理理念——Spring Boot(一)

要了解 Spring Boot 产⽣生的背景,我们就必须要先了了解⼀一下 Spring 发展史,不仅因为 Spring Boot 来源于
Spring 体系,而且 Spring Boot 的诞生和 Spring 框架的发展息息相关。

Spring的发展史:


时间回到2002年,当时正是JavaEEEJB大行其道的时候,很多知名公司都是采用此技术方案进行项目开发。这时候有一个美国的小伙子认为EJB太过臃肿,并不是所有的项目都需要使用EJB这种大型框架,应该会有一种更好的方案来解决这个问题。

为了证明他的想法是正确的,于2002年10月甚至写了一本书《Expert One-on-One J2EE》,介绍了当时Java 企业应用程序开发的情况,并指出了JavaEE和EJB组件框架中存在的一些主要缺陷。在这本书中,他提出了一个基于普通Java类和依赖注入的更简单的解决方案

在书中,他展示了如何在不使用EJB的情况下构建高质量,可扩展的在线座位预留系统。为了构建应用程序,他编写了超过30000行的基础结构代码,项目中的根包命名为com.interface21,所以人们最初称这套开源框架为interface21,也就是Spring的前身。

他是谁呢,他就是大名鼎鼎的 Rod Johnson(下图),Rod Johnson 在悉尼大学不仅获得了计算机学位,同时还获得了音乐学位,更令人吃惊的是在回到软件开发领域之前,他还获得了音乐学的博士学位。现在Rod Johnson已经离开了Spring,成为了一个天使投资人,同时也是多个公司的董事,早已走上人生巅峰。
 

Spring Boot 产⽣生的背景和它的设计理理念——Spring Boot(一)

在这本书发布后,一对一的J2EE设计和开发一炮而红。这本书免费提供的大部分基础架构代码都是高度可重用的。2003年 Rod Johnson 和同伴在此框架的基础上开发了一个全新的框架命名为Spring,据Rod Johnson 介绍Spring 是传统J2EE新的开始,随后Spring发展进入快车道。

  • ·2004年03月,1.0版发布。·2006年10月,2.0版发布。
  • ·2007年11月,更名为SpringSource,同时发布了Spring 2.5。
  • ·2009年12月,Spring3.0发布。
  • ·2013年|12月,Pivotal 宣布发布Spring 框架4.0。
  • ·2017年09月,Spring5.0发布。
     

Spring Boot 的诞⽣生


多年以来,Spring平台饱受非议的一点就是大量的XML配置以及复杂的依赖管理。随着使用Spring进行开发的个人和企业越来越多,Spring也慢慢从一个单一简洁的小框架变成一个大而全的开源软件,Spring的边界不断的进行扩充,到了后来Spring几乎可以做任何事情了,市面上主流的开源软件、中间件都有Spring 对应组件支持,人们在享用Spring的便利之后,也遇到了一些问题。

Spring 每集成一个开源软件,就需要增加一些基础配置,慢慢的随着人们开发的项目越来越庞大,往往需要集成很多开源软件,后期使用Spring 开发大型项目需要引入很多配置文件,太多的配置非常难以理解,并容易配置出错,到了后来人们甚至称Spring为配置地狱

在2013年的SpringOne 2GX会议上,Pivotal的CTOAdrian Colyer回应了这些批评,并且特别提到该平台将来的目标之一就是实现免XML配置的开发体验。Spring Boot所实现的功能超出了这个任务的描述,开发人员不仅不再需要编写XML,而且在一些场景中甚至不需要编写繁琐的import语句。

2013年,微服务的概念也慢慢兴起,快速开发微小独立的应用变得更为急迫,Spring刚好处在这么一个交叉点上,于2013年初开始的Spring Boot项目的研发,2014年,Spring Boot 伴随着Spring 4.0诞生发布了第一个正式版本。

Spring Boot 并不是要成为Spring 平台里面众多“Foundation”层项目的替代者。Spring Boot的目标不在于为已解决的问题或提供新的解决方案,而是为平台带来另一种开发体验,从而简化对这些已有技术的使用。对于已经熟悉Spring 生态系统的开发人员来说,Spring Boot是一个很理想的选择;对于采用Spring技术的新人来说,Spring Boot 提供一种更简洁的方式来使用这些技术。
 

Spring Boot 开发团队


我们经常会看到在介绍Spring Boot的时候有这么一句:Spring Boot是由Pivotal团队提供的全新框架。由此我们得知Spring Boot 是由Pivotal团队所研发,那么Pivotal团队到底是一个什么样的团队呢?其实这里的Pivotal 团队是指 Pivotal公司。

Pivotal 公司介绍:致力于变世界构造软件的方式(We are transforming how the world builds software)",提供云原生应用开发Paas平台及服务,帮助企业客户采用敏捷软件开发方法论,从而提高软收集件开发人员工作效率、减少运维成本,实现数字化转型、IT创新,并最终实现业务创新。

Pivotal 公司可谓是大牛云集,公司研发的产品有:Spring以及衍生框架、缓存中间件Redis、消息队列框架RabbitMa、数据引擎产品 Greenplum,还有Tomcat、Groovy里的一些*开发者,DevOps理论的提出者都在这个公司。2016年风靡全球的云原生理意亦是Pivotal公司提出,美国硅谷著名的精益化创业书籍的作者Eric Ries也加入了Pivotal公司。Spring Boot为什么如此的优秀,正是因为背后有这些全球的*开发者。

回顾Pivotal公司的发展历史,简直就是一场商业并购大片:

  • ·1989年,米创立Pivotal Labs公司,它的主营业务是与客户合作,帮助客户开发软件,曾给谷歌、Twitter 公司傲技术支持;
  • 2003年,EMC收购了VwMware;
  • ·2009年,VMware 收购了Spring公司;
  • 2012年,EMC以现金方式收购了Pivotal Labs公司;
  • 2013年,EMC和VMware分拆出其Cloud Foundry、Pivotal Labs、Greenplum等云计算、大数据资源,GE投资1.05亿美元,成立新公司 Pivotal;
  • 2015年,EMC又被DELL所收购。

Pivotal公司成立之后,于2014年发布了Sping Boot,2015年发布了Spring Cloud,2018年Pivotal公司在纽约上市。我们可以通过一张图来了解Pivotal公司的发展史。
Spring Boot 产⽣生的背景和它的设计理理念——Spring Boot(一)

约定优于配置


那么什么是约定优于配置呢?

约定优于配置(Convention Over Configuration),也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需做决定的数量、获得简单的好处,而又不失灵活性。

本质是说,开发人员仅需规定应用中不符约定的部分。例如,如果模型中有个名为User的类,那么数据库中对应的表就会默认命名为user。只有在偏离这一约定时,例如将该表命名为“user_info”,才需写有关这个名字的配置。

我们可以按照这个思路来设想,我们约定 Controller 层就是Web请求层可以省略MVC的配置;我们约定在Service 结尾的类自动注入事务,就可以省略了Spring的切面事务配置.…。

在Spring体系中,Spring BootJPA就是约定优于配置最佳实现之一,不需要关注表结构,我们约定类名即是表名,属性名即是表的字段,String 对应varchar,long 对应bigint,只有需要一些特殊要求的属性,我们再单独进行配置,按照这个约定我们可以将以前的工作大大的简化。

Spring Boot体系将约定优于配置的思想展现得淋淋尽致,小到配置文件,中间件的默认配置,大到内置容器、生态中的各种Starters 无不遵循此设计规则。Spring Boot 鼓励各软件组织方创建自己的Starter,创建Starter的核心组件之一就autoconfigure模块,也是Starter的核心功能,在启动的时候进行自动装配,属性默认化配置。

可以说正是因为Spring Boot简化的配置和众多的 Starters 才让Spring Boot变得简单、易用、快速上手,也可以说正是约定优于配置的思想的彻底落地才让Spring Boot 走向辉煌。Spring Boot约定优于配置的思想让Spring Boot项目非常容易上手,让编程变的更简单,其实编程本该很简单,简单才是编程的美。

Starters


 

Spring Boot Starters 基于约定优于配置的理念来设计,Spring Boot Starter中有两个核心组件:自动配置代码和提供自动配置模块及其它有用的依赖。也就意味着当我们项目中引入某个Starter,即拥有了此软件的默认使用能力,除非我们需要特定的配置,一般情况下我仅需要少量的配置或者不配置即可使用组件对应的功能

Spring Boot由众多Starter 组成,随着版本的推移 Starter 家族成员也与日俱增。在传统Maven项目中通常将一些层、组件拆分为模块来管理,以便相互依赖复用,在Spring Boot 项目中我们则可以创建自定义Spring Boot Starter 来达成该目的。

Spring Boot 拥有强大融合社区开源软件的能力,在没有使用Spring Boot之前,我们需要按照每个开源软件的特性,将对应的组件包集成到我们的开发项目中,因为每个组件的设计理念和开发团队都不一致,因此会有很多不同的调用风格在我们的项目中。

Spring Boot整合了主流的开源软件形成了一系列的Starter,让我们有了一致的编程体验来集成各种软件,Spring Boot在集成的时候做了大量的优化,让我们在集成的时候往往只需要很少的配置和代码就可以完成。可以说各种Starters 就是Spring Boot最大的优势之一。
 

以下为常用的 Spring Boot Starter 列表。

Spring Boot 产⽣生的背景和它的设计理理念——Spring Boot(一)

完整的 Starter 参考这⾥里里:Spring Boot application starters。

因为Spring Boot足够的强大,很多第三方社区都进行了主动的集成比如:MyBatis、RabbitMQ(高级用法)等,第三方社区支持的列表,可以在这里查看 Community Contrilbutions,可以看到社区贡献的其他Starters列表。
看完这些 Starters会不会瞬间觉得Spring Boot很强大,几乎我们涉及的开源软件都做了支持,在Spring Boot 环境下使用这些软件,仅仅只需要引入对应的Starter包即可。


Sprlng、Sprlng Boot 和Sprlng Cloud的关系

Spring 最初核心的两大核心功能Spring loC和Spring Aop成就了Spring,Spring在这两大核心功能上不断的发展,才有了Spring 事务、Spring MVC等一系列伟大的产品,最终成就了Spring帝国,到了后期Spring 几乎可以解决企业开发中的所有问题。

Spring Boot是在强大的Spring 帝国生态基础上面发展而来,发明Spring Boot 不是为了取代Spring,是为了让人们更容易的使用Spring。所以说没有Spring 强大的功能和生态,就不会有后期的Spring Boot火热,Spring Boot 使用约定优于配置的理念,重新重构了Spring的使用,让Spring后续的发展更有生命力。

Spring 并没有重复制造*,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部器和易维护的分布式系统开发工具包。

Spring Cloud 是一系列框架的有序集合,它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部器。Spring Cloud 是为了解决微服务架构中服务治理而提供的一系列功能的开发框架,并且Spring Cloud是完全基于Spring Boot而开发,Spring Cloud 利用Spring Boot 特性整合了开源行业中优秀的组件,整体对外提供了一套在微服务架构中服务治理的解决方案。

综上我们可以这样来理解,正是由于Spring loC和Spring Aop 两个强大的功能才有了Spring,Spring生态不断的发展才有了Spring Boot,使用Spring Boot 让Spring 更易用更有生命力,Spring Cloud是基于Spring Boot 开发的一套微服务架构下的服务治理方案。

以下为它们之间的关系。

Spring IoC/Aop > Spring > Spring Boot > Spring Cloud

总结

Spring Boot 诞生一方面是因为Spring 自身发展所遇到的问题,另一方面在微服务思想诞生之际,急需要一款快速开发工具来实现微服务技术落地,在这样的背景下诞生了Spring Boot.Spring Boot整体的设计思想是:约定优于配置、依赖此设计思路,Spring Boot 进行了大刀阔斧的改革,让人们非常容易的实现开发、测试、部器。众多的Starters成就了Spring Boot的发展,让使用Spring Boot 开发项目变的更加简单。