当前互联网后端开发中,Java技术占据了主导地位。对于Java开发,首选框架和事实标准是Spring框架。传统的Spring开发需要使用大量的XML配置才能使Spring框架运行起来,这备受许多开发者诟病。随着Spring 4.x的发布,Spring已经完全脱离XML,只使用注解就可以运行项目。在最近几年里,互联网世界掀起了微服务热潮。微服务会将一个大的单体系统按照业务拆分为独立的系统,然后通过REST风格的请求将它们集成起来,进一步简化了分布式系统的开发。为了进一步简化Spring的开发,Spring Boot于2014年诞生了,这是一个由Pivotal团队提供的全新框架,其设计目的是简化Spring应用的搭建以及开发过程,并迎合时下流行的微服务思维,越来越多的企业选择了Spring Boot。随着2017年9月Spring 5.x的推出,2018年Spring Boot也推出了2.x版本,至此Spring Boot成为Java开发的首选。为了顺应潮流,2018年我创作了《深入浅出Spring Boot 2.x》(下文简称为2.x版),此书一经推出,就成为该领域的主流图书。不过,随着Spring Boot的不断升级,2.x版的许多知识点已经过时,所以是时候对其进行升级改版了,这就是本书的缘起。
2017年甲骨文公司正式放弃Java EE,并将其交由Eclipse基金会托管。因为版权问题,Java EE这个名称不能被沿用,于是2018年Eclipse基金会将Java EE正式改名为Jakarta EE。Jakarta EE逐渐发展为主流技术,为此Spring推出了第6版,对Jakarta EE 9进行支持,而Pivotal团队在2022年11月推出了Spring Boot 3.x正式版。于是,我决定在2.x版的基础上进行升级,讲解Spring Boot 3.x。
Spring Boot采用“约定优于配置”的规则,大部分情况下依赖它提供的starter,就可以使用默认的约定,然后通过属性文件能减少大量的代码,使开发更为简单;对于打包,Spring Boot提供了内嵌服务器和Maven(或Gradle),进一步降低了企业部署的难度;对于测试,Spring Boot提供了快速测试的环境,进一步提高了测试效率;Spring Boot还提供了监控功能,使得开发者能及时把握项目运行的健康情况。在互联网世界中,分布式已经是一种必然的趋势,而在分布式架构中,微服务架构已成为当前的主流,因此Spring Boot渐渐成为企业级开发的主流选择。但是,微服务架构所需的服务治理和相关组件的研发成本并非一般公司所能承担的,因此Spring社区还将许多微服务组件通过Spring Boot的形式封装起来,发布给大家使用,这进一步简化了企业级微服务的开发。这样,Spring Boot和Spring Cloud都站到了互联网后端开发的主流方向上。对于我国主要的微服务架构选型——Spring Cloud Alibaba,本书也会进行探讨。
随着微服务和云服务的流行,Java很多原有的优势已经不是那么突出了,甚至Java和Spring Boot 2.x原有的一些优势反倒成了累赘。我们之所以选择Spring Boot 3.x,是因为它提供了两大好处。
一是拥抱最新技术 。随着时代的发展,Jakarta EE渐渐取代Java EE成为主流技术,Java 8的语法也已经严重落后于其他计算机编程语言。Spring Boot 3.x只支持Java 17及以上版本,而Java 17作为当前长期支持版本,容纳了许多新的语法,简化了开发,十分值得学习,毕竟Java 8臃肿的语法已经很难支撑项目的快速开发以及系统开发的不断迭代和交付了。
二是需要追上微服务和云服务的潮流 。随着微服务和云服务的发展,越来越多的企业使用容器进行开发、测试和部署等工作。而容器的使用使得“Build once, Run anywhere”(一次构建,到处运行)成为现实,这使得Java最大的优势——“Write once, Run anywhere”(一次编写,到处运行)大大削弱了,因为计算机语言的平台无关性已经不是一个巨大的优势了。传统Java采用的是Java虚拟机解释字节码的运行模式,在微服务和云服务中,会造成两个难以解决的问题。
● Java虚拟机解释运行程序的速度太慢。这体现在启动、部署和运行上,采用云原生文件,程序可以是毫秒级启动项目,而采用Java虚拟机后,程序只能是秒级启动项目。Java虚拟机在云服务或者微服务中性能偏慢,而采用云原生文件后,可以获得很大的性能提升。这些问题在单体系统的时代并非大问题,但是在容器化的微服务和云服务时代则被开发者所诟病,因为这不利于容器的使用。
● 镜像太大,难以管理。传统Java项目需要使用Java虚拟机来运行,同时也依赖大量的第三方包,制作成为容器的镜像太大,不利于运维环节对镜像的管理。在我的测试中,只是制作一个简单的Spring Boot项目的镜像,文件大小居然达到了490 MB。大的镜像不仅占据的空间大,还会使镜像构建、部署的时间变长,运行也会变慢。
针对这两个问题,Spring Boot 3.x开始支持预先编译技术,这是一种可以将项目在运行前直接编译为二进制文件或者机器码文件的技术,这样编译出来的文件就是云原生文件了。操作系统可以直接运行编译出来的文件,且性能比传统Java虚拟机解释的运行方式要好很多。Spring Boot 3.x的预先编译技术主要采用的是甲骨文提供的GraalVM,使用它生成的云原生文件不仅可以在操作系统直接运行,性能也更佳,制作出来的容器镜像也比传统Java镜像小得多。虽然当前GraalVM技术还不够完善,且未得到广泛使用,但它是Java未来的重要发展方向之一。
Spring Boot不是要代替Spring,而是使Spring项目可以更加快速地开发、测试和部署。它采用“约定优于配置”的理念,在内部提供大量的starter,而这些starter又提供许多自动配置类,让开发者可以奉行“拿来主义”,开箱即用。虽然这样能够快速地开发、测试和部署,但是也会带来很大的问题,那就是,如果不懂Spring的原理,一旦出现开发问题,开发者就很容易陷入困境,难以找到问题的根源,产生困扰。因此,学习Spring Boot必须掌握Spring的基础知识。基于这种情况,本书结合Spring的原理讨论Spring Boot的应用。
为了更好地讨论Spring Boot的相关知识,本书内容安排如下。
● 第1章和第2章讲解Spring Boot和传统Spring开发的区别,以及如何搭建Spring Boot开发环境。
● 第3章和第4章讨论在全注解下的Spring基础IoC和AOP,让初学者可以无缝对接Spring Boot的全注解开发方式。
● 第5章和第6章讲解数据库的开发、基于SSM框架(Spring MVC+Spring+MyBatis)的流行以及数据库事务的重要性,除了讨论传统的JDBC和JPA开发,还会重点讨论和MyBatis框架的整合,以及Spring数据库事务的编程。
● 第7章和第8章主要讲解互联网中广泛使用的两种NoSQL数据库(即Redis和MongoDB),使用它们可以极大地提高系统的性能。
● 第9章至第12章主要讲解Spring Boot下的Spring MVC的各种应用。第9章初识Spring MVC,概述Spring MVC的全流程和常见的组件;第10章深入Spring MVC的开发和应用,让读者能够掌握各种Spring Web后端的开发技巧;第11章讲解如何构建REST风格的网站,因为当前各个微服务是以REST风格请求相互融合的,所以时下它已经成为一种广泛使用的风格;第12章讲解Spring Security,通过它可以保护我们的站点,使其远离各种各样的攻击,保证网站安全。
● 第13章讲解一些Spring常用的技术,如异步线程池、异步消息和定时器等,以满足企业的其他开发需要。
● 第14章讲解Spring Boot下的SSM框架(Spring MVC+Spring+MyBatis)整合,并通过抢购业务讲述互联网中的高并发与锁的应用。
● 第15章讲解Spring Boot的打包、测试、监控、预先编译和Docker容器部署技术。
● 第16章讲解基于Spring Cloud Alibaba的微服务开发,带领读者学习国内流行的微服务架构的开发。
上述内容可以让读者对Spring Boot有深入的了解,并且通过进一步学习掌握企业级应用的开发技巧。
阅读本书前,读者需要具备Java编程语言基础、Jakarta EE(Servlet和JSP)基础、前端(HTML、JavaScript和Vue)基础和数据库(MySQL、Redis和MongoDB)基础。当然读者也可以根据自己感兴趣的技术选择部分章节来学习。
本书从Spring Boot 3.x的维度全面讲解Spring基础技术(IoC和AOP)、数据访问技术、Web技术和微服务架构等,因此本书适合以下读者。
● 使用或者即将使用Spring Boot开发的人员。
● 需要从传统Spring开发转向Spring Boot开发的人员。
● 需要使用Spring Cloud开发微服务架构的人员。
● 需要了解和学习企业级Jakarta EE开发的在校师生。从这个角度来说,本书也适合作为大中专院校的教材。
通过对本书的学习,读者可以有效地提高自身的技术能力,并能将这些技术应用于实际学习和工作当中。当然,读者也可以把本书当作工作手册来查阅。
本书在2.x版的基础上进行如下升级。
● 全面拥抱最新且被长时间支持的技术,包括Java 17、Jakarta EE 9、Spring 6.x和Spring Boot 3.x等。
● 尽量采用Java 8之后的新语法编写代码。
● 在前端技术上,删除2.x版采用的JQuery(当前已经很少用了),采用流行的前端框架Vue推荐使用的Axios。
● 使用IntelliJ IDEA作为开发默认的IDE,而非2.x版的Eclipse。
● 增加预先编译和Docker容器部署技术的讲解,更贴近企业级微服务的应用。
● 在微服务章节,剔除2.x版中过时的Spring Cloud NetFlix,拥抱目前国内流行的Spring Cloud Alibaba。
● 在2.x版的基础上,进一步完善代码样例和技术细节。
为了帮助读者更好地阅读本书,本书对以下内容进行约定。
(1)时间长度单位采用英文简写,具体为h-时、m-分、s-秒、ms-毫秒、ns-纳秒。
(2)省略import语句和Java Bean的setter与getter方法,如下:
package com.learn.chapter7.pojo; /*** ① imports ***/ @Alias("user") public class User implements Serializable { private static final long serialVersionUID = 7760614561073458247L; private Long id; private String userName; private String note; /** ② setters and getters **/ }
代码①处省略import语句,而代码②处省略Java Bean的setter()与getter()方法。
Spring Boot作为一个被高度关注的微服务开发框架,版本迭代十分频繁。本书尽可能采用最新版本,于是最终选定的Spring Boot版本是3.0.6。Spring Boot 3.x支持JDK 17及以上版本,支持Jakarta EE 9,并尽量兼容Jakarta EE 10,这些是读者在阅读本书和实践的过程中需要注意的。
本书得以顺利出版要感谢人民邮电出版社的编辑们,尤其是刘雅思编辑,她以编辑的专业精神时常鞭策我,并给予我很多建议、帮助和支持,没有编辑的付出就不会有本书的出版。
感谢我的家人对我的支持和理解,我在电脑桌前写作时,牺牲了很多本该好好陪伴他们的时光。
Spring和Spring Boot技术的使用面和涉及面十分广泛,版本更替也十分频繁,加上本人能力有限,所以书中错误之处在所难免。但是,正如没有完美的技术一样,也没有完美的书籍。尊敬的读者,如果你对本书有任何意见或建议,欢迎给我发送邮件(ykzhen2013@163.com),或者在我的CSDN博客上留言(搜索用户ykzhen2015),以便于及时修订本书的错漏。
为了更好地帮助读者学习和理解本书内容,本书还免费提供源代码下载,相关信息会发布到异步社区(https://www.epubit.com)和作者博客上,欢迎读者关注。
杨开振
2023年9月