Spring实战(第5版)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-13 17:04:19

点击下载

作者:(美) 克雷格·沃斯(Craig Walls)

出版社:人民邮电出版社有限公司

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Spring实战(第5版)

Spring实战(第5版)试读:

版权信息

书名:Spring实战(第5版)

ISBN:978-7-115-52792-9

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

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

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

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

著    [美]克雷格•沃斯(Craig Walls)

译    张卫滨

责任编辑 陈冀康

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

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

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

读者服务热线:(010)81055410

反盗版热线:(010)81055315版权声明

Original English language edition, entitled Spring in Action, Fifth Edition by Craig Walls Bibeault published by Manning Publications Co., 209 Bruce Park Avenue, Greenwich, CT 06830. Copyright © 2019 by Manning Publications Co.

Simplified Chinese-language edition copyright © 2020 by Posts & Telecom Press. All rights reserved.

本书中文简体字版由Manning Publications Co.授权人民邮电出版社独家出版。未经出版者书面许可,不得以任何方式复制本书内容。

版权所有,侵权必究。内容提要

本书是一本经典而实用的畅销Spring学习指南。

第5版涵盖了Spring 5.0和Spring Boot 2.0里程碑式的更新。全书分为5个部分,共19章。第1部分(第1~5章)涵盖了构建Spring应用的基础话题。第2部分(第6~9章)讨论如何将Spring应用与其他应用进行集成。第3部分(第10~12章)探讨Spring对反应式编程提供的全新支持。第4部分(第13~15章)拆分单体应用模型,介绍Spring Cloud和微服务开发。第5部分(第16~19章)讨论如何为应用投入生产环境做准备以及如何进行部署。

本书既适合刚开始学习Spring Boot和Spring框架的Java开发人员快速上手,也适合经验丰富的Spring开发人员学习Spring的新特性,尤其适用于企业级Java开发人员。译者序

不知不觉间,已经参与了3个版本的《Spring实战》翻译。2007年春天,当时J2EE Without EJB的风潮刚刚兴起,还在读研的我在天津大学图书馆借到第 1 版的《Spring实战》,当时忙于毕业,没有把这本书完整地读完,但是依赖注入、面向切面编程等理念还是深深印在了脑海中,书中经典有趣的圆桌骑士样例更是驱使我读了很多相关的历史背景材料。

屈指算来,已经过去了10多年,Spring早已经成为企业级Java开发的事实标准,Spring Boot和Spring Cloud相关的技术引领潮流,更是成为Java工程师的必备技能。《Spring实战》的作者Craig Walls不断推陈出新,将这本经典图书更新到第5版。只是,10多年以前,我恐怕做梦也想不到会与这本书有这么深的缘分。

Spring之所以能够在技术不断更新换代的IT领域长盛不衰,并且引领技术架构发展的潮流,我想这是因为它一直没有偏离Rod Johnson最初的目标。那就是,根据技术的发展,不断优化和革新,让Java应用的开发更加便利和高效。从XML配置、注解配置,再到Spring Boot的自动化配置,Spring在不断简化,开发人员需要做的额外工作越来越少。虽然Rod Johnson早已离开Spring去开创新的事业了,但是我相信Spring的这种基因还是一直在的。在可以预见的未来,Spring及其家族产品依然是值得花时间投资学习的技术。

有时候,我也会思考,真正的技术到底是什么,是某一项生僻的配置还是某个新的API?我想,这都是技术,却不是最关键的。因为这些东西都是不稳定的、易变的,想要在新知识层出不穷的领域中不被淘汰,我们更应该去追求一些内在稳定不变的知识,比如技术规范、设计原理等。所以,希望本书的读者能够通过这本入门的读物,去更多地探究一些Spring底层的设计和实现原理。

本书第10章关于反应式编程的初稿由何品翻译,我负责统稿修改;另外,对于反应式编程的术语和规范,何品和他的团队都做了很多的工作,在此向他表示感谢。

再次感谢我的爱人和儿子,又容忍我把这几个月的业余时间都耗在了笔记本电脑的前面。

希望这本书对读者有所帮助,如果读者在阅读中遇到问题,可以通过levinzhang1981 @126.com或者微信levinzhang1981与我联系,祝阅读愉快。张卫滨2019年7月29日于大连关于本书

编写《Spring实战(第5版)》的目的是让读者学会使用Spring框架、Spring Boot以及Spring生态系统中各种辅助部分构建令人赞叹的应用程序。本书首先介绍如何使用Spring和Spring Boot开发基于Web、以数据库作为后端的Java应用;随后进行必要的扩展,展现如何与其他应用进行集成、使用反应式类型进行编程,以及将应用拆分为离散的微服务;最后讨论如何准备应用的部署。

尽管Spring生态系统中的每个项目都提供了完善的文档,但是本书所做的是所有参考文档都无法做到的事情:提供一个实用的、项目驱动的指南,将Spring的各种元素组合起来形成一个真正的应用。谁应该阅读这本书《Spring实战(第5版)》适用于刚刚开始学习Spring Boot和Spring框架的Java开发人员,也适用于想要超越基础知识并学习Spring新特性的经验丰富的Spring开发者。这本书是如何组织的:路线图

本书分成了5个部分,共计19章。

第1部分涵盖构建Spring应用的基础话题。● 第1章介绍Spring和Spring Boot以及如何初始化Spring项目。在本

章中,我们迈出构建Spring应用的第一步,在本书后续各章中,

我们会对这个应用进行扩展。● 第2章讨论如何使用Spring MVC构建应用的Web层。在本章中,

我们将会构建处理Web请求的控制器以及在浏览器中渲染信息的

视图。● 第3章会深入探讨Spring应用的后端,在这里数据会持久化到关

系型数据库中。● 在第4章中,我们会使用Spring Security认证用户并防止未认证的

用户访问应用。● 第5章介绍如何使用Spring Boot的配置属性功能来配置Spring应

用。我们还会学习如何使用profile选择性地应用配置。

第2部分讨论如何将Spring应用与其他应用进行集成。● 第6章延续第2章对Spring MVC的讨论,我们将会学习如何在

Spring中编写REST API。● 第7章讨论了和第6章相对立的主题,展现Spring应用如何消费

REST API。● 第8章会讨论如何使用异步通信技术让Spring应用发送和接收消

息,这里会用到Java Message Service、RabbitMQ或Kafka。● 第9章讨论如何使用Spring Integration进行声明式的应用集成。

第3部分探讨Spring对反应式编程提供的全新支持。● 第10章介绍Reactor项目。这是一个反应式编程库,支撑了

Spring 5的反应式特性。● 第11章重新探讨REST API开发,介绍全新的Web框架Spring

WebFlux。该框架借用了很多Spring MVC的理念,但是为Web开

发提供了新的反应式模型。● 第12章将会看一下如何使用Spring Data编写反应式数据持久

化,我们将会读取和写入Cassandra与Mongo数据库。

第4部分将会拆分单体应用模型,介绍Spring Cloud和微服务开发。● 第13章会深入介绍服务发现,组合使用Spring和Netflix的注册中

心实现Spring微服务的注册和发现。● 第14章将展现如何在配置服务器中实现中心化的应用配置,从

而实现跨微服务共享配置。● 第15章会介绍Hystrix的断路器模式。它能够让微服务在面临失败

时更有弹性。

在第5部分中,我们将会讨论如何做好将应用投入生产环境的准备,并看一下如何进行部署。● 第16章会介绍Spring Boot Actuator。它是Spring Boot的一个扩展,

通过REST端点的形式暴露Spring应用内部的运行状况。● 第17章将会介绍如何使用Spring Boot Admin。它是构建在

Actuator之上的一个用户友好的基于浏览器的管理应用。● 第18章将会讨论如何将Spring bean暴露为JMX MBean以及如何

消费它们。● 在第19章中,我们会看到如何将Spring应用部署到各种生产环境

中。

通常来讲,刚刚接触Spring的开发人员应该从第1章开始,并按顺序阅读每一章;经验丰富的Spring开发人员可能更愿意在任何感兴趣的时候参与进来。即便如此,每一章都是建立在前一章内容的基础上的,所以如果从中间开始阅读,那么可能会漏掉一些上下文信息。关于代码

本书包含许多源代码的样例,有的是编号的程序清单,有的是普通文本内嵌的源码。在这两种情况下,源代码都使用固定宽度的字体排版,以便将其与普通文本分开。有时代码也会使用粗体显示,以便于强调此处代码与本章前面步骤的变更,比如为已有的代码行添加新的特性。

在许多情况下,原始源代码会重新格式化;我们添加了换行符和重新缩进,以适应书中可用的页面空间。在极少数情况下,这样做依然是不够的,在这种情况下程序清单会包括换行符(➥)。此外,当在文中描述代码的时候,源码中的注释通常会被移除。许多程序清单会有代码标注,用来突出强调重要的概念。

本书中样例的源码可以通过异步社区的本书页面下载。其他在线资源

还需要其他帮助吗?● Spring的Web站点有很多有用的起步指南(其中一部分就是由本

书的作者编写的)。● StackOverflow上的Spring标签和Spring Boot是一个询问Spring问

题和帮助别人的好地方。帮助解决别人的Spring问题是学习

Spring的好办法。关于作者

克雷格·沃斯(Craig Walls)是Pivotal的首席工程师。他是Spring框架的热心推动者,经常在本地用户组和会议上发言,撰写关于Spring的文章。在不琢磨代码的时候,Craig正在计划去迪士尼世界或迪士尼乐园的下一次旅行,他希望尽可能多地陪伴他的妻子和两个女儿。关于封面《Spring实战(第5版)》的封面人物是“Le Caraco”,也就是约旦西南部卡拉克(Karak)省的居民。该省的首府是Al-Karak,那里的山顶有座城堡,对死海和周边的平原有着极佳的视野。这幅图出自1796年出版的法国旅游图书,Encyclopédiedes Voyages,由J.G.St.Sauveur编写。在那时,为了娱乐而去旅游还是相对新鲜的做法,而像这样的旅游指南是很流行的,它能够让旅行家和足不出户的人们了解法国其他地区和国外的居民。

Encyclopédiedes Voyages中多种多样的图画生动描绘了200年前世界上各个城镇和地区的独特魅力。在那时,相隔几十千米的两个地区着装就不相同,可以通过着装判断人们究竟属于哪个地区。这本旅行指南展现了那个时代和其他历史时代的隔离感和距离感,这与我们这个运动过度的时代是截然不同的。

从那以后,服装风格发生了改变,富有地方特色的多样性开始淡化。现在,有时很难说一个洲的居民和其他洲的居民有什么不同。可能,从积极的方面来看,我们用原来文化和视觉上的多样性换来了个人风格的多变性,或者可以说是更为多样化和有趣的知识科技生活。这本旅行指南中的图片反映了两个世纪前各个地区生活的多样性,我们现在用图书封面的方式对其进行了再现。Manning出版社的员工都认为这是计算机行业中一个很有意思的创意。前      言

在使用了Spring 15年并编写了这本书的5个版本(暂时不算《Spring Boot实战》了)之后,你可能会认为,在为这本书撰写前言时,我很难想出一些关于Spring令人兴奋的新内容,但事实远非如此!

在Spring生态系统中,Spring、Spring Boot和所有其他项目的每个版本都发布了令人兴奋的新功能,重新点燃了开发应用程序的乐趣。Spring 5.0和Spring Boot 2.0的发布达到了一个重要的里程碑。Spring有了更多的乐趣,所以编写新版《Spring实战》是很容易的。

Spring 5的主要功能是对反应式编程的支持,包括Spring WebFlux。这是一个全新的反应式Web框架,借鉴了Spring MVC的编程模型,允许开发人员创建伸缩性更好且耗用更少线程的Web应用程序。至于Spring应用的后端,最新版本的Spring Data支持创建反应式、非阻塞的数据repository。所有这些都构建在Reactor项目之上,Reactor是一个用于处理反应式类型的Java库。

除了Spring 5新的反应式编程特性之外,Spring Boot 2提供了比以前更多的自动配置支持,以及一个完全重新设计的Actuator,用于探查和操作正在运行的应用。

更重要的是,当开发人员希望将单体应用拆分为分散的微服务时,Spring Cloud提供了一些工具,使配置和发现微服务变得容易,并增强了微服务的功能,使它们更能抵御失败。

我很高兴地说,《Spring实战(第5版)》涵盖了所有的这些功能,甚至更多!如果你是经验丰富的老手,《Spring实战(第5版)》可以作为指南,指导你去学习Spring提供的新功能;如果你是Spring新手,那么现在是行动起来的最佳时机,本书的前几章会让你快速上手!

与Spring合作的15年是令人兴奋的。现在我已经写了5个版本的《Spring实战》,我很想和你们分享这份兴奋!致      谢

Spring和Spring Boot所做的最令人惊奇的事情之一就是自动为应用程序提供所有的基础功能,让开发人员专注于应用程序特有的逻辑。不幸的是,对于写书这件事来说,并没有这样的魔法。是这样的吗?

在Manning,有很多人在施展“魔法”,确保这本书是最好的。特别要感谢我的项目编辑Jenny Stout以及制作团队,其中包括项目主管Janet Vail、文字编辑Andy Carroll和Frances Buran,以及校对Katie Tennant和Melody Dolab。同时也要感谢技术校对Joshua White,他的工作很全面,很有帮助。

在此过程中,我们得到了几位同行评论的反馈,他们确保了这本书没有偏离目标,涵盖了正确的内容。为此,我要感谢Andrea Barisone、Arnaldo Ayala、Bill Fly、Colin Joyce、Daniel Vaughan、David Witherspoon、Eddu Melendez、Iain Campbell、Jettro Coenradie、John Gunvaldson、Markus Matzker、Nick Rakochy、Nusry Firdousi、Piotr Kafel、Raphael Villela、Riccardo Noviello、Sergio Fernandez Gonzalez、Sergiy Pylypets、Thiago Presa、Thorsten Weber、Waldemar Modzelewski、Yagiz Erkan和Zěljko Trogrlić。

和往常一样,如果不是Spring工程团队成员所做的出色工作,写这本书是没有任何意义的。我惊叹于你们所创造的成果,并期待未来继续改变软件开发的方式。

非常感谢我的同行们在No Fluff/Just Stuff巡回演讲上的发言。我从你们每个人身上学到很多。我特别要感谢Brian Sletten、Nate Schutta和Ken Kousen关于Spring的对话和邮件,这些内容塑造了这本书。[1]

我要再次感谢Phoenicians,你们太棒了。

最后,我要感谢我美丽的妻子Raymie。她是我生命中的挚爱,是我最甜蜜的梦想,也是我的灵感来源:谢谢你的鼓励,也谢谢你为这本新书做的努力。致我可爱的女儿Maisy和Madi:我为你们感到骄傲,为你们即将成为了不起的年轻女士感到骄傲。我对你们的爱超出了你们的想象,也超出了我语言所能表达的程度。[1] Phoenicians指的是远古时代的腓尼基人,他们被认为是字母系统的创建者,基于字母的所有现代语言都是由此衍生而来的。在迪士尼世界的Epcot,有名为Spaceship Earth的时光穿梭体验,我们可以了解到人类交流的历史,甚至能够回到腓尼基人的时代,在这段旅程的旁白中这样说道:如果你觉得学习字母语言很容易,就感谢腓尼基人吧,是他们发明了它。这是作者的一种幽默说法。——译者注资源与支持

本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。配套资源

本书提供如下资源:● 本书源代码;● 书中彩图文件。

要获得以上配套资源,请在异步社区本书页面中点击,跳转到下载界面,按提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。

如果您是教师,希望获得教学配套资源,请在社区本书页面中直接联系本书的责任编辑。提交勘误

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,点击“提交勘误”,输入勘误信息,点击“提交”按钮即可。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。与我们联系

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit.com/ selfpublish/submission即可)。

如果学校、培训机构或企业想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。关于异步社区和异步图书“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。异步社区微信服务号第1部分 Spring基础

本书的第1部分将会介绍如何开始编写Spring应用,并在这个过程中学习Spring的基础知识。

在第 1 章中,我将简要介绍Spring和Spring Boot的核心知识,并展示在构建第一个Spring应用Taco Cloud的过程中如何初始化Spring项目。在第2章中,我们将深入研究Spring MVC,了解如何在浏览器中显示模型数据,以及如何处理和验证表单输入。我们还会介绍选择视图模板库的技巧。在第3章中,我们将向Taco Cloud应用程序添加数据持久化功能。到时候,我们将介绍如何使用Spring的JDBC模板来插入数据,以及如何使用Spring Data声明JPA repository。第4章将介绍Spring应用程序的安全性,包括自动配置Spring安全性、声明自定义用户存储、自定义登录页面以及防止跨站请求伪造(CSRF)攻击。作为第1部分的结尾,我们将在第5章中学习配置属性。我们将了解如何细粒度调整自动配置bean、让应用组件使用配置属性,以及如何使用Spring profile。第1章 Spring起步

 本章内容:● Spring和Spring Boot的必备知识● 初始化Spring项目● Spring生态系统概览

尽管希腊哲学家赫拉克利特(Heraclitus)并不作为一名软件开发人员而闻名,但他似乎深谙此道。他的一句话经常被引用:“唯一不变的就是变化”,这句话抓住了软件开发的真谛。

我们现在开发应用的方式和1年前、5年前、10年前都是不同的,更别提15年前了,当时Rod Johnson的图书Expert One-on-One J2EE Design and Development介绍了Spring框架的初始形态。

当时,最常见的应用形式是基于浏览器的Web应用,后端由关系型数据库作为支撑。尽管这种形式的开发依然有它的价值,Spring也为这种应用提供了良好的支持,但是我们现在感兴趣的还包括如何开发面向云的由微服务组成的应用,这些应用会将数据保存到各种类型的数据库中。另外一个崭新的关注点是反应式编程,它致力于通过非阻塞操作提供更好的扩展性并提升性能。

随着软件开发的发展,Spring框架也在不断变化,以解决现代应用开发中的问题,其中就包括微服务和反应式编程。Spring还通过引入Spring Boot简化自己的开发模型。

不管你是开发以数据库作为支撑的简单Web应用,还是围绕微服务构建一个现代应用,Spring框架都能帮助你达成目标。本章是使用Spring进行现代应用开发的第一步。1.1 什么是Spring

我知道你现在可能迫不及待地想要开始编写Spring应用了,我可以向你保证,在本章结束之前,你肯定能够开发一个简单的Spring应用。首先,我将使用Spring的一些基础概念为你搭建一个舞台,帮助你理解Spring是如何运行起来的。

任何实际的应用程序都是由很多组件组成的,每个组件负责整个应用功能的一部分,这些组件需要与其他的应用元素进行协调以完成自己的任务。当应用程序运行时,需要以某种方式创建并引入这些组件。

Spring的核心是提供了一个容器(container),通常称为Spring应用上下文(Spring application context),它们会创建和管理应用组件。这些组件也可以称为bean,会在Spring应用上下文中装配在一起,从而形成一个完整的应用程序。这就像砖块、砂浆、木材、管道和电线组合在一起,形成一栋房子似的。

将bean装配在一起的行为是通过一种基于依赖注入(dependency injection,DI)的模式实现的。此时,组件不会再去创建它所依赖的组件并管理它们的生命周期,使用依赖注入的应用依赖于单独的实体(容器)来创建和维护所有的组件,并将其注入到需要它们的bean中。通常,这是通过构造器参数和属性访问方法来实现的。

举例来说,假设在应用的众多组件中,有两个是我们需要处理的:库存服务(用来获取库存水平)和商品服务(用来提供基本的商品信息)。商品服务需要依赖于库存服务,这样它才能提供商品的完整信息。图1.1阐述这些bean和Spring应用上下文之间的关系。图1.1 应用组件通过Spring的应用上下文来进行管理并实现互相注入

在核心容器之上,Spring及其一系列的相关库提供了Web框架、各种持久化可选方案、安全框架、与其他系统集成、运行时监控、微服务支持、反应式编程以及众多现代应用开发所需的特性。

在历史上,指导Spring应用上下文将bean装配在一起的方式是使用一个或多个XML文件(描述各个组件以及它们与其他组件的关联关系)。例如,如下的XML描述了两个bean,也就是InventoryService bean和ProductService bean,并且通过构造器参数将InventoryService装配到了ProductService中:

但是,在最近的Spring版本中,基于Java的配置更为常见。如下基于Java的配置类是与XML配置等价的:@Configurationpublic class ServiceConfiguration { @Bean public InventoryService inventoryService() { return new InventoryService(); } @Bean public ProductService productService() { return new ProductService(inventoryService()); }}

@Configuration注解会告知Spring这是一个配置类,会为Spring应用上下文提供bean。这个配置类的方法使用@Bean注解进行了标注,表明这些方法所返回的对象会以bean的形式添加到Spring的应用上下文中(默认情况下,这些bean所对应的bean ID与定义它们的方法名称是相同的)。

相对于基于XML的配置方式,基于Java的配置会带来多项额外的收益,包括更强的类型安全性以及更好的重构能力。即便如此,不管是使用Java还是使用XML的显式配置,只有当Spring不能进行自动配置的时候才是必要的。

在Spring技术中,自动配置起源于所谓的自动装配(autowiring)和组件扫描(component scanning)。借助组件扫描技术,Spring能够自动发现应用类路径下的组件,并将它们创建成Spring应用上下文中的bean。借助自动装配技术,Spring能够自动为组件注入它们所依赖的其他bean。

最近,随着Spring Boot的引入,自动配置的能力已经远远超出了组件扫描和自动装配。Spring Boot是Spring框架的扩展,提供了很多增强生产效率的方法。最为大家所熟知的增强方法就是自动配置(autoconfiguration),Spring Boot能够基于类路径中的条目、环境变量和其他因素合理猜测需要配置的组件并将它们装配在一起。

我非常愿意为你展现一些关于自动配置的示例代码,但是我做不到。自动配置就像风一样,你可以看到它的效果,但是我找不到代码指给你说,“看!这就是自动配置的样例!”事情发生了,组件启用了,功能也提供了,但是不用编写任何代码。没有代码就是自动装配的本质,也是它如此美妙的原因所在。

Spring Boot大幅度减少了构建应用所需的显式配置的数量(不管是XML配置还是Java配置)。实际上,当完成本章的样例时,我们会有一个可运行的Spring应用,该应用只有一行Spring配置代码。

Spring Boot极大地改善了Spring的开发,因此很难想象在没有它的情况下如何开发Spring应用。因此,本书会将Spring和Spring Boot当成一回事。我们会尽可能多地使用Spring Boot,只有在必要的时候才使用显式配置。因为Spring XML配置是一种过时的方式,所以我们主要关注Spring基于Java的配置。

闲言少叙,既然本书的名称中包含“实战”这个词,那么就开始动手吧!下面我们将会编写使用Spring的第一个应用。1.2 初始化Spring应用

在本书中,我们将会创建一个名为Taco Cloud的在线应用,它能[1]够订购人类所发明的一种美味,也就是墨西哥煎玉米卷(taco)。当然,在这个过程中,为了达成我们的目标,我们将会用到Spring、Spring Boot以及各种相关的库和框架。

我们有多种初始化Spring应用的可选方案。尽管我可以教你手动创建项目目录结构和定义构建规范的各个步骤,但这无疑是浪费时间,我们最好将时间花在编写应用代码上。因此,我们将会学习如何使用Spring Initializr初始化应用。

Spring Initializr是一个基于浏览器的Web应用,同时也是一个REST API,能够生成一个Spring项目结构的骨架,我们还可以使用各种想要的功能来填充它。使用Spring Initializr的几种方式如下:● 通过地址为https://start.spring.io/的Web应用;● 在命令行中使用curl命令;● 在命令行中使用Spring Boot命令行接口;● 在Spring Tool Suite中创建新项目;● 在IntelliJ IDEA中创建新项目;● 在NetBeans中创建新项目。

我将这些细节放到了附录中,这样就不用在这里花费很多页的篇幅介绍每种方案了。在本章和本书中,我都会向你展示如何使用我最钟爱的方式创建新项目:在Spring Tool Suite中使用Spring Initializr。

顾名思义,Spring Tool Suite是一个非常棒的Spring开发环境。它同时还提供了便利的Spring Boot Dashboard特性,这个特性是其他IDE都不具备的(至少在我编写本书的时候如此)。

如果你不是Spring Tool Suite用户,那也没有关系,我们依然可以做朋友。你可以跳转到附录中,查看最适合你的Initializr方案,以此来替换后面小节中的内容。但是,在本书中,我偶尔会提到Spring Tool Suite特有的特性,比如Spring Boot Dashboard。如果你不使用Spring Tool Suite,那么需要调整这些指令以适配你的IDE。1.2.1 使用Spring Tool Suite初始化Spring项目

要在Spring Tool Suite中初始化一个新的Spring项目,我们首先要点击File菜单,选择New,接下来选择Spring Starter Project。图1.2展现了要查找的菜单结构。图1.2 在Spring Tool Suite中使用Initializr初始化一个新项目

在选择Spring Starter Project之后,将会出现一个新的向导对话框(见图1.3)。向导的第一页会询问一些项目的通用信息,比如项目名称、描述和其他必要的信息。如果你熟悉Maven pom.xml文件的内容,就可以识别出大多数的输入域条目最终都会成为Maven的构建规范。对于Taco Cloud应用来说,我们可以按照图1.3的样子来填充对话框。图1.3 为Taco Cloud应用指定通用的项目信息

向导的下一页会让我们选择要添加到项目中的依赖(见图1.4)。注意,在对话框的顶部,我们可以选择项目要基于哪个Spring Boot版本。它的默认值是最新的可用版本。一般情况下,最好使用这个默认的值,除非你需要使用不同的版本。

至于依赖项本身,你可以打开各个区域并查找所需的依赖项,也可以在Available顶部的搜索框中对依赖进行搜索。对于Taco Cloud应用来说,我们最初的依赖项如图1.4所示。图1.4 选择Starter依赖

现在,你可以点击Finish来生成项目并将其添加到工作空间中。但是,如果你还想多体验一些,那么可以再次点击Next,看一下新Starter项目向导的最后一页,如图1.5所示。图1.5 指定备用的Initializr地址

默认情况下,新项目的向导会调用Spring Initializr来生成项目。通常情况下,没有必要覆盖默认值,这也是我们可以在向导的第二页直接点击Finish的原因。但是,如果你基于某种原因托管了自己的Initializr克隆版本(可能是本地机器上的副本或者公司防火墙内部运行的自定义克隆版本),那么你可能需要在点击Finish之前修改Base Url输入域,使其指向自己的Initializr实例。

在点击Finish之后,项目会从Initializr下载并加载到工作空间中。此时,要等待它加载和构建,然后你就可以开始开发应用功能了。下面我们看一下Initializr都为我们提供了什么。1.2.2 检查Spring项目的结构

项目加载到IDE中之后,我们将其展开,看一下其中都包含什么内容。图1.6展现了Spring Tool Suite中已展开的Taco Cloud项目。图1.6 Spring Tool Suite中所展现的初始Spring项目结构

你可能已经看出来了,这就是一个典型的Maven或Gradle项目结构,其中应用的源码放到了“src/main/java”中,测试代码放到了“src/test/java”中,而非Java的资源放到了“src/main/resources”。在这个项目结构中,我们需要注意以下几点。● mvnw和mvnw.cmd:这是Maven包装器(wrapper)脚本。借助

这些脚本,即便你的机器上没有安装Maven,也可以构建项目。● pom.xml:这是Maven构建规范,随后我们将会深入介绍该文

件。● TacoCloudApplication.java:这是Spring Boot主类,它会启动该

项目。随后,我们会详细介绍这个类。● application.properties:这个文件起初是空的,但是它为我们提供

了指定配置属性的地方。在本章中,我们会稍微修改一下这个文

件,但是我会将配置属性的详细阐述放到第5章。● static:在这个文件夹下,你可以存放任意为浏览器提供服务的

静态内容(图片、样式表、JavaScript等),该文件夹初始为

空。● templates:这个文件夹中存放用来渲染内容到浏览器的模板文

件。这个文件夹初始是空的,不过我们很快就会往里面添加

Thymeleaf模板。● TacoCloudApplicationTests.java:这是一个简单的测试类,它能

确保Spring应用上下文可以成功加载。在开发应用的过程中,我

们会将更多的测试添加进来。

随着Taco Cloud应用功能的增长,我们会不断使用Java代码、图片、样式表、测试以及其他附属内容来充实这个项目结构。不过,在此之前,我们先看一下Spring Initializr提供的几个条目。探索构建规范

在填充Initializr表单的时候,我们声明项目要使用Maven来进行构建。因此,Spring Initializr所生成的pom.xml文件已经包含了我们所选择的依赖。程序清单 1.1 展示了Initializr为我们提供的完整pom.xml。程序清单1.1 初始的Maven构建规范 4.0.0 sia taco-cloud 0.0.1-SNAPSHOT jar ⇽--- 打包为JAR taco-cloud Taco Cloud Example org.springframework.boot spring-boot-starter-parent 2.0.4.RELEASE ⇽--- Spring Boot的版本 UTF-8 UTF-8 1.8 ⇽--- Starter依赖 org.springframework.boot spring-boot-starter-thymeleaf org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-devtools runtime org.springframework.boot spring-boot-starter-test test org.seleniumhq.selenium selenium-java test org.seleniumhq.selenium htmlunit-driver test ⇽--- Spring Boot插件 org.springframework.boot spring-boot-maven-plugin

在pom.xml文件中,我们第一个需要注意的地方就是。我们选择了将应用构建成一个可执行的JAR文件,而不是WAR文件。这可能是你所做出的最奇怪的选择之一,对Web应用来说尤为如此。毕竟,传统的Java Web应用都是打包成WAR文件,JAR只是用来打包库和较为少见的桌面UI应用的。

打包为JAR文件是基于云思维做出的选择。尽管WAR文件非常适合部署到传统的Java应用服务器上,但对于大多数云平台来说它们并不是理想的选择。有些云平台(比如Cloud Foundry)也能够部署和运行WAR文件,但是所有的Java云平台都能够运行可执行的JAR文件。因此,Spring Initializr默认会使用基于JAR的打包方式,除非我们明确告诉它采用其他的方式。

如果你想要将应用部署到传统的Java应用服务器上,那么需要选择使用基于WAR的打包方式并要包含一个Web初始化类。在第2章中,我们将会更详细地了解如何构建WAR文件。

接下来,请留意元素,更具体来说是它的子元素。这表明我们的项目要以spring-boot-starter-parent作为其父POM。除了其他的一些功能之外,这个父POM为Spring项目常用的一些库提供了依赖管理,现在你不需要指定它们的版本,因为这是通过父POM来管理的。这里的2.0.4.RELEASE表明要使用Spring Boot 2.0.4,所以会根据这个版本的Spring Boot定义来继承依赖管理。

既然我们谈到了依赖的话题,那么需要注意在元素下声明了 3 个依赖。在某种程度上,你可能会对前两个更熟悉一些。它们直接对应我们在Spring Tool Suite新项目向导中点击Finish之前所选择的Web和Thymeleaf依赖。第三个依赖提供了很多有用的测试功能。我们没有必要在专门的复选框中选择它,因为Spring Initializr假定你将会编写测试(希望你会正确地开展这项工作)。

你可能也会注意到这 3 个依赖的artifact ID上都有starter这个单词。Spring Boot starter依赖的特别之处在于它们本身并不包含库代码,而是传递性地拉取其他的库。这种starter依赖主要有3个好处。● 构建文件会显著减小并且更易于管理,因为这样不必为每个所需

的依赖库都声明依赖。● 我们能够根据它们所提供的功能来思考依赖,而不是根据库的名

称。如果是开发Web应用,那么你只需要添加web starter就可以

了,而不必添加一堆单独的库再编写Web应用。● 我们不必再担心库版本的问题。你可以直接相信给定版本的

Spring Boot,传递性引入的库的版本是兼容的。现在,你只需要

关心使用的是哪个版本的Spring Boot就可以了。

最后,构建规范还包含一个Spring Boot插件。这个插件提供了一些重要的功能。● 它提供了一个Maven goal,允许我们使用Maven来运行应用。在

1.3.4小节,我们将会尝试这个goal。● 它会确保依赖的所有库都会包含在可执行JAR文件中,并且能够

保证它们在运行时类路径下是可用的。● 它会在JAR中生成一个manifest文件,将引导类(在我们的场景

中,也就是TacoCloudApplication)声明为可执行JAR的主类。

谈到了主类,我们打开它看一下。引导应用

因为我们将会通过可执行JAR文件的形式来运行应用,所以很重要的一点就是要有一个主类,它将会在JAR运行的时候被执行。我们同时还需要一个最小化的Spring配置,以引导该应用。这就是TacoCloudApplication类所做的事情,如程序清单1.2所示。程序清单1.2 Taco Cloud的引导类package tacos;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication ⇽--- Spring Boot应用public class TacoCloudApplication { public static void main(String[] args) { SpringApplication.run(TacoCloudApplication.class, args); ⇽--- 运行应用 }}

尽管在TacoCloudApplication中只有很少的代码,但是它包含了很多的内容。其中,最强大的一行代码也是最短的。@SpringBootApplication注解明确表明这是一个Spring Boot应用。但是,@SpringBootApplication远比看上去更强大。

@SpringBootApplication是一个组合注解,它组合了3个其他的注解。● @SpringBootConfiguration:将该类声明为配置类。尽管这个类

目前还没有太多的配置,但是后续我们可以按需添加基于Java的

Spring框架配置。这个注解实际上是@Configuration注解的特殊

形式。● @EnableAutoConfiguration:启用Spring Boot的自动配置。我们

随后会介绍自动配置的更多功能。就现在来说,我们只需要知道

这个注解会告诉Spring Boot自动配置它认为我们会用到的组件。● @ComponentScan:启用组件扫描。这样我们能够通过像

@Component、@Controller、@Service这样的注解声明其他

类,Spring会自动发现它们并将它们注册为Spring应用上下文中

的组件。

TacoCloudApplication另外一个很重要的地方是它的main()方法。这是JAR文件执行的时候要运行的方法。在大多数情况下,这个方法都是样板代码,我们编写的每个Spring Boot应用都会有一个类似或完全相同的方法(类名不同则另当别论)。

这个main()方法会调用SpringApplication中静态的run()方法,后者会真正执行应用的引导过程,也就是创建Spring的应用上下文。在传递给run()的两个参数中,一个是配置类,另一个是命令行参数。尽管传递给run()的配置类不一定要和引导类相同,但这是最便利和最典型的做法。

你可能并不需要修改引导类中的任何内容。对于简单的应用程序来说,你可能会发现在引导类中配置一两个组件是非常方便的,但是对于大多数应用来说,最好还是要为没有实现自动配置的功能创建一个单独的配置类。在本书的整个过程中,我们将会创建多个配置类,所以请继续关注后续的细节。测试应用

测试是软件开发的重要组成部分。鉴于此,Spring Initializr为我们提供了一个测试类作为起步。程序清单1.3展现了这个测试类的概况。程序清单1.3 应用测试类的概况package tacos;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class) ⇽--- 使用Spring的运行器@SpringBootTest ⇽--- Spring Boot测试public class TacoCloudApplicationTests { @Test ⇽--- 测试方法 public void contextLoads() { }}

TacoCloudApplicationTests类中的内容并不多:这个类中只有一个空的测试方法。即便如此,这个测试类还是会执行必要的检查,确保Spring应用上下文能够成功加载。如果你所做的变更导致Spring应用上下文无法创建,那么这个测试将会失败,你就可以做出反应来解决相关的问题了。

另外,注意这个类带有@RunWith(SpringRunner.class)注解。@RunWith是JUnit的注解,它会提供一个测试运行器(runner)来指导JUnit如何运行测试。可以将其想象为给JUnit应用一个插件,以提供自定义的测试行为。在本例中,为JUnit提供的是SpringRunner,这是一个Spring提供的测试运行器,它会创建测试运行所需的Spring应用上下文。测试运行器的其他名称

如果你已经熟悉如何编写Spring测试或者见过其他一些基于Spring的测试类,那么你可能见过名为SpringJUnit4ClassRunner的测试运行器。SpringRunner是SpringJUnit4ClassRunner的别名,是在Spring 4.3中引入的,以便于移除对特定JUnit版本的关联(比如,JUnit 4)。毫无疑问,这个别名更易于阅读和输入。

@SpringBootTest会告诉JUnit在启动测试的时候要添加上Spring Boot的功能。从现在开始,我们可以将这个测试类视同为在main()方法中调用SpringApplication.run()。在这本书中,我们将会多次看到@SpringBootTest,而且会不断见识它的威力。

最后,就是测试方法本身了。尽管@RunWith(SpringRunner.

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载