Spring Boot 2实战权威指南——基础篇

作者: 李家智
译者:
编辑: 曹修山

图书目录:

详情

本专栏是Spring Boot 2权威实战指南基础篇,内容紧密结合实战,同时提供一个适合中等复杂企业系统的开源开发平台plus系统供学习。本专栏杜绝纯理论,杜绝贴源码行为,杜绝只讲Spring Boot,能让读者立刻学习,立刻使用,提供了较为全面的基础知识,可以作为参考资料供开发使用。

图书摘要

版权信息

书名:Spring Boot 2实战权威指南——基础篇

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

著    李家智

责任编辑 曹修山

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315


本专栏是Spring Boot 2权威实战指南基础篇,内容紧密结合实战,同时提供一个适合中等复杂企业系统的开源开发平台plus系统供学习。本专栏杜绝纯理论,杜绝贴源码行为,杜绝只讲Spring Boot,能让读者立刻学习,立刻使用,提供了较为全面的基础知识,可以作为参考资料供开发使用。本专栏没有深入介绍Spring Boot源码,但也提供了Spring Boot的一些关键类说明,读者可以从这些类开始了解Spring Boot源码。


李家智,网名闲大赋,是国内Beetl,BeetlSQL等基础软件开源作者,具有近20年的 Java编程经验,至今还在一线开发,经常在博客上发表自己的技术见解。现定居于北京,曾就职于大型的电信厂商、外企、互联网电商等,现就职于京东交易中台架构组,负责分布式系统架构升级和优化,熟悉JavaEE,Spring,分布式等技术。


Java的各种开发框架发展了很多年,影响了一代又一代的开发人员,无论是程序员,还是架构师,使用这些框架开发不到万人规模的企业应用或者开发1分钟千万访问量的互联网电商系统都面临着两方面的挑战。

环顾当前Java开源世界中的流行技术框架,能同时满足快速开发和分布式系统架构的框架,当属群众基础最好,功能最全,基于Spring技术的Spring Boot框架。

这几年来,企业应用的开发框架都渐渐使用Spring Boot 2作为基础,以我的开发经历来看,在写作本书第一版的时候,公司一开始是拒绝使用Spring Boot 的,而坚持使用Spring,后来也是在调研后同意采用Spring Boot并取得了很好效果。

如果你搜索关于Spring 的开发“脚手架”,你会发现这些“脚手架”已经转为以SpringBoot 2为基础的开发框架。互联网公司也开始大量采用Spring Boot,一些巨无霸互联网公司虽然由于历史原因没有采用Spring Boot和Spring Cloud,但这些公司的框架和微服务设计,跟Spring Boot和Spring Cloud相差无几。

开发脚手架是指一套现成的系统,它包含了技术框架(如使用Spring Boot),和基础的业务领域的功能,以及业务开发规范。开发脚手架通常包含最基础的用户、机构、权限、数据字典管理,也可能包含代码生成功能,基础的工作流集成等。本书附录会介绍SpringBoot-Plus开发脚手架,一个适合中小型企业应用的脚手架。

而开发框架是一套技术框架,如Spring Boot 2,基于Spring的SpringSide,Struts等的技术框架。

本书系统介绍了Spring Boot 2 的主要技术,主要侧重两个方面,一方面是极速开发一个WEB应用系统。第1到第7章,主要讲解了Spring介绍、MVC、视图技术、数据库访问技术,随Spring Boot的高级特性。第8章到第11章,讲解配置Spring Boot等高级特性、多环境部署、单元测试,以及深入IOC,AOP和事务。第2章主要对Spring Boot Plus项目做了简要介绍。

阅读本书的人,可以是Java新手,也可以是Spring新手,还可以是用过Spring,但想进一步了解Spring Boot的开发者。如果你已经使用过Spring Boot,本书也非常适合你全面深入了解Spring Boot。

读完本书后,读者能轻松快速构建Web应用系统,也能握分布式系统架构实现。

笔者作为一个从事Java开发19年的程序员,这里给新手一些诚恳的建议,用于帮助新手掌握Spring Boot 2。

如果你是Java新手,Spring新手或者是Spring Boot新手,建议先按照本书每章的例子先模仿一遍。不要急于按照自己项目要求去改,这样很容易使掌握的知识不牢固、不全面。如果遇到自己暂时无法理解的知识,也建议优先记住这些知识点。

当理解完书中的知识,能运行书中提供的例子(推荐手写,或者从官网下载例子)后,可以尝试主动制造一些错误。看看Spring Boot 会给你什么样的错误提示。通过主动制造错误,观察Spring Boot应用的错误信息或者请求对应的输出来深入学习Spring Boot。这不仅是学习Spring Boot,也是学习其他框架,学习其他编程技术甚至是各种编程语言的一个学习窍门。

本书每章都会提及Spring Boot框架的一些接口或者关键类,即使不了解这些类的实现细节,你也仍然可以运用Spring Boot。如果想深入掌握Spring Boot,建议阅读这些类的源代码了解这些类的职责以及如何实现职责。可以通过IDE的快捷键打开这些类,以Eclipse 为例子,用ctlr-t 打开这些类去阅读Spring源码。还可以在这些类的方法里打上断点,在运行本书的例子的时候,查看在断点处发什么来帮助你理解Spring Boot。

如果对于这些类还是无法理解,可以通过搜索引擎搜索这些类,总有些博客和技术文章在讨论这些类的职责和实现方式。

谨慎对待互联网搜索结果,这是因为Spring Boot 2 技术本身较新,发展也较快,通过互联网搜索结果关注一下文章发布日期,文章适用版本,如果你在使用Spring Boot 2中遇到任何问题,也都欢迎到社区交流,社区地址是ibeetl.com。

本书是在SpringBoot 2.0 精髓的第二版,根据第一版的反馈,有如下改进。

本书并不是一本Spring原理书或者SpringBoot 2的源码解析书,本书紧贴SpringBoot 2实战和定制化开发,如果你想立即使用SpringBoot2,只需本书一本就够了,而不像其他书要分好几本买,看数千页的资料才能编写Spring Boot 实战项目,《Spring Boot2 实战》 是最好的选择。 本书例子

本书的所有例子都直接访问码云或者ibeetl.com网站获取书中代码,网站还提供了关于Spring Boot 更深入的例子,并且包括两个实例,一个是采用Spring Boot 构建的轻量级BBS,还有一个企业应用脚手架的完整例子Spring Boot Plus。,这两个例子被国内很多中小企业再次定制使用。本书会介绍Spring Boot Plus项目。

如下是本书例子的截图。

每一章节的例子

Spring Boot Plus

轻量级BBS

请购买正版电子书,正版包含了最新内容修订版本。本书的第一版曾经因为在国内某著名程序员网站上被盗版下载数千本而让我感到非常沮丧。

购买正版,可以得到作者本人的技术讲解和售后支持,购买盗版尽管可以勉强阅读,但是有什么能比花50元钱就能得到最新版本,以及作者的互动更划算的事情呢。

正版购买地址:https://www.kancloud.cn/xiandafu/springboot2-in-practice/

首先感谢我的妻子苗珺,对我的大力支持,没有她的支持,是不可能完成一本书写作的。

还要感谢我的朋友们,我的读者小伙伴们,你们给予了我一次又一次的信任,我必定不辜负你们的信任。

还要感谢那些一直怀着异样目光看着我的京东前同事,仿佛写书是一件不务正业的事情。写书既为社会做了贡献,也肯定会为公司做了贡献,也是完美了自己的人生经历。

由于Spring和Spring Boot 技术体系博大精深,尽管本书已经是第二版,然而我技术水平有限,写作过程中精力也有限,难免有纰漏,敬请读者指正。电子书可以随时根据读者反馈完善内容,也期盼读者能购买正版电子书,以鼓励作者持续跟踪Spring Boot技术,不断向读者呈现更好的Spring Boot书籍以及实战经验。

本书的官网论坛是 ibeetl.com。


我 1999年接触JSP,从2001年开始正式接触Java EE技术,当时面对JavaEE那么多组件和规范(比如,EJB技术),确实有点蒙圈。编写一个企业应用居然用到了那么多技术,曾经的电信项目,启动需要10分钟,每次发布都需要一个小时。作为新手的我是不能理解的,这也是当时大多数程序员的心态。然而Java EE ,针对复杂企业系统所指定的规范和实现,能满足复杂企业应用需求,这也是为什么JavaEE 很快就流行起来,并在电信,银行等领域广泛使用的原因。2003年Spring 横空出世,它告诉所有人,编写企业应用、Web应用,并非需要全部的JavaEE技术,也不需要有像EJB那样复杂的使用方式和部署方式。使用Spring开发和部署网站和企业应用变得很便捷。同时Spring建立在Java EE基础上,也同样可以使用Java EE的的功能。基于技术的创新和兼容传统Java EE技术,使得Spring框架很快流行起来,普遍应用在传统企业应用和互联网应用中。

看到现在JS前端技术的混乱,群雄并起,我觉得当时使用JavaEE还是很幸福的 。无疑,有一个统一的技术规范或者技术框架,是程序员的福音,也是企业的福音。

JavaEE 现在已经更名为 Jakarta EE。本书仍然以Java EE指代 Jakarta EE。

要应用Spring Boot技术,不一定需要先从Spring技术开始(这也是Spring Boot的初衷),更不需要了解Java EE。然而,稍微了解JavaEE和Spring技术,对掌握Spring Boot会有个更深的理解。

从根本上来说,Java EE 是一种企业应用的软件架构。在了解它之前,我们先来看看它的发展背景。它的发展背景中总是与分布式应用和互联网应用密切相关。

JavaEE与Web:互联网从根本上改变对企业软件的系统需求,软件需要处理来自互联网的大量请求,并要及时作出响应。可以说没有Web,就没有JavaEE。

JavaEE与分布式应用:20世纪80年代,个人计算机性能逐渐达到了高端工作站和服务器的水准,使分布式计算应用迅速普及。SUN公司在推出Java后,紧接着推出了远程方法调用RMI,并在90年代末期,以RMI为通信基础构建了JavaEE。在相当长的一段时间,JavaEE就是一种分布式应用,这让JavaEE战胜了CORBA和.COM+。但是也带来了巨大的系统交互开销(超出一个数量级的),毕竟不是所有的企业应用和互联网应用都是分布式的,这让一些人认为JavaEE架构有问题。然而这并不是JavaEE的错,在市场上,JavaEE需要迎合当时的分布式技术潮流。现在如果你不用分布式, JavaEE也同样提供了相关技术供你使用,如Local EJB。

作为企业应用或者互联网应用的架构,总有如下功能需求,JavaEE也都有相应的规范实现与之对应。

还有如下其他技术。

综上所述,Java EE 提供了企业应用技术的实现规范,简化了企业应用和Web开发,如图1-1所示。

图1-1

Java EE规范总结了企业应用,结束了WEB开发的技术无序状态,让程序员、架构师用同一种思维去思考如何架构和开发应用(想想前端架构现在的无序性,开发后端程序员有多幸福啊)。然而Java EE有其局限性。

Spring 是为了解决应用复杂性而生的框架,它吸取了Java EE 容器管理优点,提供了一个IOC容器来管理Bean和通过AOP方式增强Bean功能。不同的是它并没像Java EE那样详细规定容器提供的何种服务和容器里运行的具体组件类型。Spring只是提供了两种机制,控制反转(IoC)和面向切面(AOP)来提供任意的服务和增强Bean任意特性,使得的Spring本身简单易掌握,又可以通过Bean管理来无限扩展功能。

Spring 也没有像JavaEE标准制定那样有负责的流程和涉及大的厂商的利益,Spring发展来自于社区驱动。

Spring架构同Java EE 一样,包含了企业应用需要的各种技术,这也是本书的主要内容。Spring 本身提供了两个最核心的技术,就是IOC 容器和AOP增强。图1-2所示是介绍Spring的一个经典图,我们沿用这个图来说明Spring。

图1-2 Spring介绍

IOC Core Coanainer,Spring 容器,负责管理你的任意对象,会结合你对对象的描述进行初始化和加强。比如,对于一个用注解@Controller 申明的对象,Spring会认为这个对象是个Web Controller,这个对象里的方法如果有@RequestMapping 注解,则会将客户端发起的htttp请求映射成java方法调用,代码如下:

@Controller
public class HelloworldController {
    @RequestMapping("/sayhello.html")
    public @ResponseBody String say(String userName){
        return "hello "+userName;
    }
}

如上例子,Spring 容器初始化HelloworldController实例后,响应客户端发起的/sayhello.html请求,执行say方法,并自动将请求参数按照say方法申明的名称一一对应上。

Spring 通常提供一些@Controller 、@Service、 @Component 、@Configuration 注解,只有拥有这些注解的类才会引起Spring 容器的注意,并根据注解含义增强对象。

Spring 可以管理和增强任意对象,如常见的@Service注解对象,通常用来处理业务逻辑,Spring 容器往往会增强这类对象的事务控制能力。

容器管理还可以为被管理的Bean提供其他被管理和被增强的Bean。如一个已经被@Service 注解的UserService 类,在 HelloworldController类里,使用@Autowired 自动注入这个实例。

@Controller
public class HelloworldController {
    @Autowired UserService userService;

    @RequestMapping("/sayhello.html")
    public @ResponseBody String say(String userName){
        return "hello "+userService.query(userName).getDepartment().getName();
    }

}

AOP,上面提到的对象增强,离不开AOP技术,AOP(Aspect Oriented Programming)只面向切面编程。它是通过编译方式或者运行时刻,对目标对象动态添加功能,如图1-3所示,Spring容器有能力对Service类进行增强,当调用Service方法的时候,会先调用AOP的实现。

图1-3

AOP分离了企业应用的业务逻辑和系统级服务,比如事物服务、缓存服务、应用系统的审计、安全访问等. 关于AOP详细介绍,我们将在第11章详细说明。

随着Spring功能越来越强,在使用Spring的时候,门槛也变得越来越高。诸如搭建一个简单的基于Spring的Web程序,并不简单,需要各种配置。Spring过时的一些技术也经常无意中被引用到最新项目。新手面对同一种需求,比如处理事物是用XML配置好,还是通过注解@Tranactional好,这时会出现选择困难,这是因为Spring 通过多年发展,本身已经变得臃肿,过时的使用方式没有被淘汰,这样就会给初学者带来混乱。同时Spring也集成来越来越多第三方技术,如何方便地使用这些第三方技术,解决版本之间冲突,都需要时间。尽管Spring很强大,但它也在犯Java EE的错误,存在如下缺点。

庆幸的是,Spring的开发者们及时认识到这个问题,推出了基于Spring技术的Spring Boot,解决了Spring的如上问题,尤其是上手难,技术使用不统一这个个问题。经过快速发展,Spring也逐渐被开发人员喜爱,成为搭建系开发框架非常好的选择。正如本书一直强调的,Spring Boot能极速开发Web系统,也能容易的架构大的分布式系统。

Spring和Java EE 都很强大,从前面对JavaEE的和Spring的介绍来看,两者有两个本质区别。

想知道大公司的技术专家们在对JavaEE做什么,可以访问https://jcp.org/en/home/index。

Spring Boot 简化了Spring应用开发,不需要配置就能运行Spring应用。Spring Boot管理Spring容器、第三方插件,并提供很多默认的系统级服务。大部分Spring应用,无论是简单的Web系统,还是复杂的系统构建,都只需要少量配置和代码就能完成,这有点像每个公司的基于Spring框架做的公司开发框架,不同的是,Spring Boot更完善,更强大。

在上一节里描述了Spring的缺点,因此国内使用Spring的公司,都曾经有一个自有基于Spring的技术框架:基于Spring集成多种技术工具。 笔者所在公司就有一套这样的技术框架和使用方法。而在之前的公司也有一套类似的Spring技术框架和使用规范,一千个公司,便有一千个Spring技术框架。Spring Boot结束了这种较为混乱的使用Spring的方式,提供了一个统一的技术框架,也选择了多种流行开源技术作为框架的一部分。可以说,公司使用了Spring Boot技术框架,那技术选型和架构就变得更为简单和统一。

我们知道,Spring使得Java EE开发变得简单,Spring Boot 使得 Spring开发更为简单。Spring Boot通过Starter来提供系统级服务,Spring Boot已经提供了一系列Starter。比如需要开发一个Web应用,要在pom.xml申明一下即可,代码如下:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

如果你的应用用到了Redis,则使用 spring-boot-starter-data-redis,Spring Boot会自动为你配置Redis需要的各种配置以及Redis的jar包、依赖包、合适的版本,如下是Spring Boot提供的常用Starter(TODO)。

名称

作用

spring-boot-starter-web

Web开发支持,默认使用Tomcat8

spring-boot-starter-aop

AOP开发支持,使用AspectJ

spring-boot-starter-jdbc

Spring JDBC

spring-boot-starter-data-jpa

JPA方式访问数据库,使用Hibernate作为JPA实现

spring-boot-starter-data-elasticsearch

集成Elastic Search,默认访问localhost:9200

spring-boot-starter-data-redis

集成Redis,使用 Lettuce.,默认连接localhost:6379

spring-boot-starter-cache

缓存,支持多种缓存方式,如Local的,如Redis,Ehcache等

spring-boot-devtools

应用程序快速重启的工具,提升开发体验

spring-boot-starter-data-mongodb

集成mongodb,默认访问 mongodb://localhost/test

spring-boot-starter-data-neo4j

集成neo4j,默认访问 localhost:7474

spring-boot-starter-data-gemfire

集成分布式缓存

spring-boot-starter-data-solr

基于apache lucene的搜索平台,默认访问http://localhost:8983/solr

spring-boot-starter-data-cassandra

集成cassandra,默认访问 localhost:7474

spring-boot-starter-data-ldap

集成ldap

spring-boot-starter-activemq

消息集成ActiveMQ 支持

spring-boot-starter-amqp

消息集成,AMQP协议支持,如支持RabbitMQ

spring-boot-starter-jta-atomikos

分布式事务支持,使用atomikos

spring-boot-starter-jta-bitronix

一个开源得分布式事务支持

spring-boot-starter-test

包含Junit,Spring Test,Hamcrest,Mockito,JsonPath等测试工具

spring-boot-starter-webservices

webservice 支持

spring-boot-starter-websocket

websocket 支持

spring-boot-starter-jersey

Rest 应用和 Jersey 支持

spring-boot-starter-freemarker

Fremaker支持

Spring Boot 能让开发更简单,而且在维护、监控上也变得简单。我会在本书的后面章节详细说明。

传统的企业应用或者互联网系统,在构建系统的时候,所有功能推挤到一起,体积过于庞大,庞大的单体系统会有如下大家心知肚明的问题。

Spring Boot 适合创建小微系统,也适合创建微服务系统,例如Spring Boot加上Spring Cloud 技术构建微服务系统,Spring Boot 负责构建微服务和小微系统,Spring Cloud负责管理微服务和小微系统。

现在谈Spring Boot 不足还为时过早,我尝试总结一下我认为的Spring Boot 不足之处。

我们知道Java有很多日志框架,比如Log4J、Logback、java.util.logging ,同时也有很多日志调用抽象层工具,其中最常用的抽象层工具是Apache的Commons Logging 和 SLF4J。SLF4J支持日志消息参数化被各个公司视为最优的开发实践而推荐使用。

Spring Boot 使用JDK自带的HttpURLConnection实现Rest调用,而高效和功能齐全的OKHttp 并没有被默认使用。

Spring Boot 应用开发过程可以有多种方式实现热部署,最好通过 spring-boot-devtools工具,在pom.xml 中配置如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>

devtools工具会监控classpath上文件变化,包括class、配置文件、模板文件、静态资源,如HTML、devtools默认不会监控静态资源的变化,如果需要设定,可以配置,已经默认配置好的,代码如下:

spring.devtools.restart.exclude=static/**,public/**

在我的项目里,热部署还是非常快的,不到2秒。如果你对热部署时间耗时太长感到不满意,可以考虑尝试使用JRebel ,不过这已经超出了本文的范围。

由于devtools只监控classpath上的变化,因此在Ecipse如果保存Java文件,则会立即触发Eclipse编译,并把编译后的文件同步到classpath里。如果你使用Idea,则需要build整个工程才能生效。


相关图书

推荐系统:产品与算法解析
推荐系统:产品与算法解析
计算机科学概论(第13版)
计算机科学概论(第13版)
量子计算:新计算革命
量子计算:新计算革命
计算机科学概论 Python版
计算机科学概论 Python版
网空态势感知理论与模型
网空态势感知理论与模型

相关文章

相关课程