1问:Spring Boot是脚手架吗?
不是。
很多人认为凡是帮你快速搭建项目的就是脚手架,但其实不然。脚手架这个词并借用自建筑行业,所以我们先搞清楚这个词本身的含义。真实的脚手架就是建筑工地盖楼房的时候外面那一层钢管搭建的架子,把整个楼房围起来,方便建筑工人在外围施工。还有绿色的网罩起来,起到保护作用。
脚手架和所有的建筑材料不同之处在于,它只在建筑过程中起到作用。楼房建成了,脚手架就拆掉了。其他砖瓦混凝土都会融入为建筑的一部分,但是脚手架是不会作为物业的一部分交付给业主的。
就Web开发来说,脚手架这个词最早其实出现在前端。Yeoman就是创建各种脚手架工具的通用平台,在上面可以开发各种generator。
而且,脚手架工具大多都是用命令行工具的方式提供的。例如创建Angular应用的ng cli,创建React应用的create-react-app,创建Vue的vue cli。
Spring Boot确实方便你搭建应用,但它的Jar会进入你最终编译的成果,会成为可执行Jar的一部分。所以Spring Boot本身不是脚手架。
不过,Spring里面是有脚手架的,就是Spring Initializr,是一个在线程序。可以通过http://start.spring.io访问。如果习惯了用cli的方式使用脚手架,也可以用Spring Boot Cli。Spring Boot Cli其实也是调用了http://start.spring.io的服务。
2问:Spring Boot是全家桶吗?
不是。
很多人认为Spring Boot是全家桶,是原有Spring全家桶的一种升级易用版。因为原来大家就习惯把Spring成为全家桶,因为Spring下的项目太多了,包括Spring Framework(包含Spring IoC、Spring MVC、Spring AOP等等),Spring Data下面的子项目(包含Spring Data JPA、JDBC、MongoDB),Spring Security…
全家桶这个词来自快餐吧,肯德基麦当劳什么的。全家桶是包含了一组东西,你吃的完吃不完都是桶里包含的这些东西。
但是Spring Boot不是。因为Spring Boot没有包含Spring MVC,没有包含Spring Data,没有包含Spring Security。Sprint Boot提供的只是对应他们的各个starter。
3问:Spring Boot能替代Spring MVC吗?
肯定不能。
应为Spring Boot不是Spring的全家桶,没有包含Spring MVC,只是提供了spring-boot-starter-web,方便你把Spring MVC配置好。你写Web应用,还是要用到Spring MVC。
从Spring 5开始,有了一种和Spring MVC并行的开发Web的框架,叫做Spring WebFlux。所以你完全可以不用Spring MVC,用spring-boot-starter-webflux把Spring WebFlux配置好,然后用WebFlux写响应式的Web服务器端。
4问:Spring Boot是框架吗?
不是。
框架提供了一种编程模型,让开发者在框架规划的结构中增加自己的业务逻辑,最后时限自己的业务需求。
所以Spring Framework是框架,而且是个大框架。Spring MVC和Spring WebFLux是框架,是写Web应用的框架。但Spring Boot不是。
5问:Spring Boot和SSM一样吗?
完全不一样。
我曾经做过一个比喻:
SSM是什么?是三个臭皮匠(裨将),Spring IoC、Spring MVC、Mybatis的组合。SSM限定死了你只能开发Java Web应用,而且MVC框架必须用Spring MVC,持久层必须用Mybatis,无他!我说的是SSM包含这些啊,没说你不能在这三个基础上自己加东西上去。
Spring Boot呢?诸葛亮。有了诸葛亮,你用兵的可选方案更多,不管用哪几员将军,出师更顺利。Spring Boot没有和任何MVC框架绑定!没有和任何持久层框架绑定!没有和任何其他业务领域的框架绑定!
SSM和SSH这种都是特定框架的经典组合,和Spring Boot完全没有对比性。
如果Spring Boot通过spring-boot-starter-web和mybatis-spring-boot-starter两个starter把Spring MVC和Mybatis整合进来,就有点可比性了。但这只是Spring Boot的一种用法而已,而且Spring更推荐数据持久层用Spring Data JPA(Hibernate)。
6问:Spring Boot能开发什么类型的应用?
现在又要看图1了。三个立方体就是Spring Boot开发的应用。
第一个立方体:Spring Boot。用Spring Boot开发各种应用,可能是Web的,也可能不是Web的。只要有对应的spring-boot-starter-xxx,就可以非常方便的把需要的框架或技术整合进来。
目前Spring官方提供了46个starters,完整列表看这里:13. Build Systems
还有一些第三方开源社区提供的starter,例如我们之前提过的mybatis-spring-boot-starter,能够整合Mybatis。
第二个立方体:Spring Cloud。Spring Cloud的结构可以参考图3。API Gateway、config dashboard、service registry本身都是基于Spring Boot的应用。而图里的MicroService是要我们自己用Spring Boot开发的微服务 。某一个微服务可能是Web应用,也可能是纯粹的业务应用,但他们都是构建与Spring Boot之上的。
第三个立方体:Spring Cloud Data Flow。这部分相当于原来的Spring Integration和Spring Batch。我们也需要用Spring Boot去开发Stream和Task。这些都是纯粹的服务器端应用,不是Web应用。
所以,几乎整个Spring体系都已经建立在了Spring Boot之上了。而其他第三方社区的框架(例如Mybatis)也在适配Spring Boot。
7问:Spring Boot只适合开发原型?
传统观念认为Java EE开发(Enterprise 企业级嘛)就是是复杂笨重的,不是轻量级的。所以有人介绍说Spring Boot可让你的工程快速启动有效减少各种配置项的时候,就很容易就让人产生这个东西只能用来快速开发原型的认识。
但其实Spring Boot提供了很多生产环境下需要的管理、监控等功能特性,比如Loggers,Metrics,Auditing,HTTP Tracing,Process Monitoring等等。
8问:Spring Boot到底给Java EE开发带来了什么?
主要是还是带来了Java开发全生命周期的便利性。
项目搭建。这个就不说了,主要是各个Starters和Autoconfigure,还有脚手架Cli。大部分人都理解到这一点。
开发过程。有Developer Tools(spring-boot-devtools)提供服务器端自动重启、前端的LIveReload、运行时远程访问远程更新。
发布部署。有Maven Plugin(spring-boot-maven-plugin),打包成可执行的(fat)Jar。方便分发部署、方便在容器中使用。
产品环境。提供Actuator(Loggers,Metrics,Auditing,HTTP Tracing,Process Monitoring)等一些列产品环境需要的功能。
9问:Spring Boot颠覆了Java EE开发吗?
没有。
有三种颠覆:从马车到汽车是交通出行的颠覆,从燃油车到纯电动车是能源利用的颠覆,从人工驾驶到AI智是驾驶方式的颠覆。第一种颠覆是彻底颠覆,后两种只能算作该领域内的局部技术的升级换代。
只是把手动挡改成自动挡、加装一键启停、无钥匙进入、自动跟车、车道偏离预警,然后还能用手机APP时刻监控车辆状态,我觉得不算颠覆。而Spring Boot类似这些。
Spring Boot的出现,更像是以前电脑硬件需要自己用光盘或网上下载安装驱动,变成了现在Windows 10能帮你安装绝大部分驱动,并帮你配置好默认参数。也更像是USB的出现,做到了硬件的即插即用(Plug & Play)。
总结
太多介绍Spring Boot的书和文章会宣称它颠覆了Java EE开发,这种说法言过其实了。这个”颠覆“给人的感觉就是:Spring MVC不用学了,Spring其他都不用学了,Spring Boot颠覆了他们的,取代了他们,包含了他们所有的功能。这些问题在知乎上到处都是。