Author:Craig Walls
本书以Spring应用程序开发为中心,全面讲解如何运用Spring Boot提高效率,使应用程序的开发和管理更加轻松有趣。作者行文亲切流畅,以大量示例讲解了Spring Boot在各类情境中的应用,内容涵盖起步依赖、Spring Boot CLI、Groovy、Grails、Actuator。对于Spring Boot开发应用中较为繁琐的内容,附录奉上整理完毕的表格,一目了然,方便读者查阅。
Tags
Support Statistics
¥.00 ·
0times
Text Preview (First 20 pages)
Registered users can read the full content for free
Register as a Gaohf Library member to read the complete e-book online for free and enjoy a better reading experience.
Page
1
(This page has no text content)
Page
2
(This page has no text content)
Page
3
内 容 提 要 本书以 Spring 应用程序开发为中心,全面讲解如何运用 Spring Boot 提高效率,使应用程序的开发和管 理更加轻松有趣。作者行文亲切流畅,以大量示例讲解了Spring Boot在各类情境中的应用,内容涵盖起步依赖、 Spring Boot CLI、Groovy、Grails、Actuator。对于 Spring Boot 开发应用中较为繁琐的内容,附录奉上整理完 毕的表格,一目了然,方便读者查阅。 本书适合全体 Java 开发人员。 定价:59.00元 读者服务热线:(010)51095186转600 印装质量热线:(010)81055316 反盗版热线:(010)81055315 广告经营许可证:京东工商广字第 8052 号 著 [美] Craig Walls 译 丁雪丰 责任编辑 朱 巍 执行编辑 张 憬 责任印制 彭志环 人民邮电出版社出版发行 北京市丰台区成寿寺路11号 邮编 100164 电子邮件 315@ptpress.com.cn 网址 http://www.ptpress.com.cn 北京 印刷 开本:800×1000 1/16 印张:14 字数:331千字 2016年 9 月第 1 版 印数:1 — 3 500册 2016年 9 月北京第 1 次印刷 著作权合同登记号 图字:01-2016-4638号 ◆ ◆ ◆
Page
4
4 前 言 译者序 时光回到2004年,Spring Framework 1.0正式发布,同年,Rod Johnson的Expert one-on-one J2EE Development without EJB一经出版就震撼了整个Java世界。不知不觉,12年就这么过去了,Spring 已然成为Java应用开发的事实标准,影响着无数Java开发者。 刚才打开Spring的官网,已经能看到Spring Framework 5.0.0 SNAPSHOT的身影了,而Spring 的家族也早就不再是Spring Framework一枝独秀,Spring Data、Spring Batch、Spring Security等一 大堆名字让人看得眼花缭乱。其中最引人瞩目的无疑就是Spring Boot了,它正是本书的主角。 Spring Boot从无数知名企业的实践中吸取经验,总结并落实到框架中。如果说Spring Framework的目标是帮助开发者写出好的系统,那Spring Boot的目标就是帮助开发者用更少的代 码,更快地写出好的生产系统。 Spring Boot为开发者带来了更好的开发体验,但写完代码只是万里长征路上的一小步,后续的 运维工作才是让很多人真正感到无助的。Spring Boot在运维方面做了很多工作,部署、监控、度量, 无一不在其涉猎范围之内,结合Spring Cloud后还可以轻松地实现服务发现、服务降级等功能。 2014年,Spring Source的Josh Long在向我介绍Spring Boot时,我不断重复一句话:“这个功 能我们也做了。”的确,国内的百度、阿里、腾讯,国外的Amazon、Facebook、Twitter、Netflix 等一票大公司都在框架和系统建设上有大量投入,为了提升性能和可用性,大家做了很多卓有成 效的工作。现在,Spring Boot让人人都能享受业内顶级公司的“福利”,站在巨人的肩膀之上, 想想都让人觉得兴奋。 说起为何想要翻译本书,那只能说是缘分使然。笔者当年在机缘巧合之下与Spring结缘,也 因它结识了很多朋友。毫不夸张地说,是Spring开启了我的作译者生涯,先后参与了Spring官方 文档、《Spring专业开发指南》和《Spring攻略》的翻译。 本以为在完成了30岁前每年翻译一本书的目标后,我应该不会再去翻译什么东西了,甚至在 向图灵的编辑推荐本书时,我都没有想到最后会是自己来翻译这本书。不得不感叹一声,缘分就 是如此妙不可言的东西。相信后续Spring Boot会有更好地发展,因为它牢牢抓住了开发者的需求。 Craig的《Spring实战》已经到了第4版,本书应该也会有第2版,此时此刻正捧着本书的您会成为 它的译者吗?至少让我们一起来为自己喜欢的技术贡献一份力量吧。 丁雪丰 2016年7月于上海
Page
5
序 1 1 2 3 4 5 8 10 11 9 6 7 序 2014年春天,Netflix的交付工程团队开始着手实现一个伟大的目标——通过一个软件平台来 实现端到端的全局持续交付,该平台有利于系统的可扩展性及弹性。为了满足Netflix的交付与部 署需要,我的团队曾构建了两套不同的应用程序,但这两套应用程序都有演变成庞然大物的趋势, 而且都没能满足灵活性和弹性的目标。更重要的是,这些庞大的应用程序最终还拖了我们的后腿, 让我们跟不上合作伙伴的创新步伐。用户开始回避我们的工具,而不是使用它们。 很明显,如果想要向公司证明自己的真正价值并快速创新,我们需要把庞然大物分解成小的 独立服务,这些服务要能随时发布。拥抱微服务架构给我们带来了希望,让我们能实现灵活性与 弹性的双重目标。但是我们需要在一个可靠的基础上实现这一架构,它要能实现真正的并发、合 理的监控、可靠易用的服务发现,运行时还要有极好的性能。 我们要在JVM上寻找一款框架,它要直接提供快速开发的能力和强大的运维能力。最终,我 们找到了Spring Boot。 Spring Boot能用寥寥数行代码构建一套基于Spring并满足生产要求的服务,不费吹灰之力! 实际上,一个简单的Spring Boot Hello World应用程序能放进一条推文里,这在短短几年之前还是 完全不可能的事情。它还自带了不少非功能性的特性,比如安全、度量、健康检查、内嵌服务器 和外置配置,这些都让选择Spring Boot成为了一件顺理成章的事情。 然而,踏上Spring Boot之旅后,我们却发现手头没有好的文档。要搞明白怎么利用好框架的 特性,只能依靠源码,这可不是个让人愉快的办法。 Manning那本著名的《Spring实战》的作者再度接受挑战,将Spring Boot的核心用法写成了另 一本好书,对此我一点都不吃惊。毫无疑问,Craig和Manning的团队又做成了一件了不起的大事! 正如我们所料,《Spring Boot实战》是一本通俗易懂的好书。 从第1章引人入胜的介绍以及富有传奇色彩的90字符推文应用程序,一直到第7章对Spring Boot的Actuator(提供了很多生产应用程序所需的神奇的运维特性)的深度分析,《Spring Boot实 战》做到了知无不言,言无不尽。实际上,对我而言,第7章对Actuator的深度分析解答了不少问 题,这些问题自一年多以前我开始使用Spring Boot后,就一直萦绕在我的脑海里。第8章对部署 选项的透彻研究让我大开眼界,了解到Cloud Foundry在云部署方面是如此简便。第4章是我最喜 欢的章节之一,Craig揭示了很多强大的选项,它们能很方便地测试Spring Boot应用程序。从一开 始我就惊喜于Spring的测试特性,而Spring Boot将它们发挥得淋漓尽致。 正如上文中我所说的那样,Spring Boot正是十几年来Java社区所探寻的那种框架。它那简单
Page
6
2 序 易用的开发特性和开箱即用的运维能力,让Java开发再度趣味横生。我欣然向大家宣布,Spring 和Spring Boot已经成为了Netflix新持续交付平台的基础。而且,Netflix的其他团队也参考了我们 的做法,因为他们也看到了Spring Boot的巨大益处。 我怀着兴奋与激动的心情,向大家强烈推荐Craig的书。作为Spring Boot的文档,本书可谓通 俗易懂、趣味横生,是Spring Boot征服Java社区后,大家翘首以盼的佳作。Craig浅显易懂的写作 风格,对Spring Boot核心特性与功能的全面分析,一定能让读者对Spring Boot有个彻底的认识(而 且在满心欢喜的同时还肃然起敬)。 Craig加油!Manning出版社加油!那些开发出Spring Boot的天才开发者们加油!请你们一定 坚持下去!正是你们确保了JVM的光明未来。 Andrew Glover Netflix交付工程团队经理
Page
7
前 言 1 1 2 3 4 5 8 10 11 9 6 7 前 言 在1964年的纽约世界博览会上,沃特·迪士尼向世界介绍了三件有开创意义的东西:“小小 世界”(it’s a small world)、“与林肯先生共度的伟大时刻”(Great Moments with Mr. Lincoln)以 及“文明演进之旋转木马”(Carousel of Progress)。①所有这三样东西随后都搬进了迪士尼乐园和 迪士尼世界,你今天仍能看见它们。 其中,我最喜欢的是“文明演进之旋转木马”,这大约也是沃特·迪士尼的最爱之一。这既 是骑行,又是舞台表演,座位区域围绕着中心区域旋转,上演四场表演,讲述了一个家庭在20 世纪不同时代(分别是20世纪初、20世纪20年代、20世纪40年代和近年)的故事,突出了不同年 代技术的进步。从手摇洗衣机,到电灯和收音机,到自动洗碗机和电视,再到电脑和声控家电, 无一不在述说着创新的故事。② 在每幕表演中,父亲(也是演出的叙述者)都会讲述最新的发明,并带上一句“这玩意儿不 能更好了”,到头来却发现随着技术的进步,它的确变得更好了。 比起这场舞台演出,Spring的历史要短得多。但是对于Spring,我的感受和“演进老爹” (Progress Dad)对20世纪的体会相似。似乎每个Spring应用程序都让开发者的生活更上一个台阶, 仅从Spring组件的声明和织入方式就能看出端倪。让我们来看看Spring历史中的一些演化历程。 Spring 1.0的出现彻底改变了我们开发企业级Java应用程序的方式。Spring的依赖注入与声 明式事务意味着组件之间再也不存在紧耦合,再也不用重量级的EJB了。这玩意儿不能更 好了。 到了Spring 2.0,我们可以在配置里使用自定义的XML命名空间,更小、更简单易懂的配 置文件让Spring本身更便于使用。这玩意儿不能更好了。 Spring 2.5让我们有了更优雅的面向注解的依赖注入模型(即@Component和@Autowired 注解),以及面向注解的Spring MVC编程模型。不用再去显式地声明应用程序组件了,也 不再需要去继承某个基础的控制器类了。这玩意儿不能更好了。 到了Spring 3.0,我们有了一套基于Java的全新配置,它能够取代XML。在Spring 3.1里, 一系列以@Enable开头的注解进一步完善了这一特性。终于,我们第一次可以写出一个 没有任何XML配置的Spring应用程序了。这玩意儿不能更好了。 —————————— ① 关于这届世博会里迪士尼相关的信息,详见http://www.dwz.cn/2Hrvyh中的Disney influence部分。——译者注 ② 关于这个游乐设施,详见http://www.yesterland.com/progress.html的介绍。——译者注
Page
8
2 前 言 Spring 4.0对条件化配置提供了支持,根据应用程序的Classpath、环境和其他因素,运行 时决策将决定使用哪些配置,忽略哪些配置。那些决策不需要在构建时通过编写脚本确 定了;以前会把选好的配置放在部署的包里,现在情况不同了。这玩意儿不能更好了。 现在轮到Spring Boot了。虽然Spring的每个版本都让我们觉得一切都不能更好了,但Spring Boot还是向我们证明了Spring仍然有巨大的潜力。事实上,我相信Spring Boot是长久以来Java开 发历程里最意义深刻、激动人心的东西。 以历代Spring Framework的进步为基础,Spring Boot实现了自动配置,这让Spring能够智能探 测正在构建何种应用程序,自动配置必要的组件以满足应用程序的需要。对于那些常见的配置场 景,不再需要显式地编写配置了,Spring会替你料理好一切。 选择在构建时和运行时要包含在应用程序里的库,往往要花费不少工夫,而Spring Boot的起 步依赖(starter dependency)将常用依赖聚合在一起,借此简化一切。它不仅简化了你的构建说 明,还让你不必苦思冥想特定库和版本。 针对使用Groovy来开发Spring应用程序,Spring Boot的命令行界面提供了一个令人瞩目的选 项,它将Java应用程序开发过程中的噪声降到最低,开发方式平易近人。有了Spring Boot CLI, 就不再需要访问方法了,不再需要诸如public与private之类的访问修饰符,也不再需要分号 或者return关键字。在许多场景中,import语句都可以去掉。因为你是在命令行里以脚本方式 运行应用程序,所以连构建说明都能免了。 Spring Boot的Actuator让你能一窥应用程序运行时的内部工作细节,看看Spring应用程序上下 文里都有哪些Bean,Spring MVC控制器是怎么与路径映射的,应用程序都能取到哪些配置属性, 诸如此类。 Spring Boot为我们带来了这么多奇妙的特性,这玩意儿当然不能更好了! 本书中你将看到,Spring Boot着实让Spring比以前更好了。我们将一同去了解自动配置、Spring Boot起步依赖、Spring Boot CLI和Actuator。我们还会去摆弄一下Grails的最新版本,它就是基于 Spring Boot的。临近末尾,你也许会觉得Spring不可能更好了。 如果说迪士尼的“文明演进之旋转木马”告诉了我们什么事情,那就是当我们觉得什么东西 不可能更好了的时候,它一定会变得更好。Spring Boot的进步正在带来越来越大的益处。真的难 以想象Spring还能变得更好,但它肯定会更好。毫无疑问,Spring的前景总是美好的。
Page
9
关于本书 1 1 2 3 4 5 8 10 11 9 6 7 关于本书 Spring Boot旨在简化Spring的开发,就这点而论,Spring Boot涉及了Spring的方方面面。用一 本书讲清楚Spring Boot的所有用法是不可能的,因为这必须涵盖Spring本身所支持的各种技术。 所以《Spring Boot实战》把Spring Boot大致分为4个主题:自动配置、起步依赖、命令行界面和 Actuator。书中还会讲到一些必要的Spring特性,但重点还是在Spring Boot上。 《Spring Boot实战》面向的是全体Java开发者。虽然读者需要有一些Spring背景,但Spring Boot 让那些新接触Spring的人也更容易上手。然而,因为本书的重点是Spring Boot,不会深入Spring 本身,所以手边再准备一本Spring读物也许效果会更好,比如说《Spring实战(第4版)》。 章节安排 《Spring Boot实战》全书分为8章。 第1章会对Spring Boot进行概述,内容涵盖最基本的自动配置、起步依赖、命令行界面和 Actuator。 第2章会进一步深入Spring Boot,重点介绍自动配置和起步依赖。在这一章里,你将用很 少的显式配置来构建一个完整的Spring应用程序。 第3章是对第2章的补充,演示了如何通过设置应用程序属性来改变自动配置,或者在自 动配置无法满足需要时彻底覆盖它。 在第4章里我们会看到如何为Spring Boot应用程序编写自动化集成测试。 在第5章里你将看到一种有别于传统Java开发方式的做法,Spring Boot CLI能让你通过命 令行来运行应用程序,这个应用程序完全是由Groovy脚本构成的。 讲到Groovy,第6章会介绍Grails 3,这是Grails框架的最新版本,它基于Spring Boot。 在第7章里你将看到如何通过Spring Boot的Actuator了解运行中的应用程序,以及它是如何 工作的。你还会看到如何使用Actuator的Web端点、远程shell和JMX MBean对应用程序一 窥究竟。 第8章讨论了各种部署Spring Boot应用程序的方法,包括传统的应用程序服务器部署和云 部署。
Page
10
2 关于本书 编码规范及代码下载 书中包含了很多代码示例,这些代码使用了等宽字体,如DispatcherServlet。正文中出 现的所有类名、方法名或者是XML片段也会用这种字体。不少Spring的类和包的名字都特别长(但 是一目了然),因此在需要时会使用续行符(➥)。书中的代码并非都是完整的,通常我只会就某 个特定主题摘出类中的一两个方法。 你可以在Manning出版社的网站上下载书中应用程序的完整代码,地址是www.manning.com/ books/spring-boot-in-action。 作者在线 购买本书的读者还能免费访问Manning出版社的私有Web论坛,在那里你能就本书发表评论, 询问技术问题,向作者以及其他用户寻求帮助。如需访问并订阅该论坛,请打开浏览器访问 www.manning.com/books/spring-boot-in-action。该页面提供了详细的信息,告诉你在注册后如何 访问论坛,论坛里都能提供哪些帮助,以及论坛的管理规则。 Manning向读者承诺,为读者与读者之间以及读者与作者之间的沟通建立桥梁。但Manning 并不保证作者在论坛中的参与程度,他们在论坛上投入多少精力是全凭自愿的(并且是无偿的)。 我们强烈建议你向作者问些有挑战性的问题,让他有兴趣留在论坛里。 只要本书仍在销售,你就能在出版商的网站上查找作者在线论坛及其讨论归档。 关于封面图 本书封面上的插画题为“喀山鞑靼民族服饰”(Habit of a Tartar in Kasan),喀山是俄罗斯联 邦鞑靼斯坦共和国首府。这幅图选自Thomas Jefferys的《各国古代和现代服饰集》(A Collection of the Dresses of Different Nations, Ancient and Modern,共四卷,1757—1772年间出版于伦敦),该书 扉页中谈到,这些插画都是手工上色、铜版雕刻,还用了阿拉伯树胶。Thomas Jefferys(1719—1771) 被誉为“乔治三世国王的御用地理学家”(Geographer to King George III)。他是一名英国地图制 图师,是当时地图行业的领导者。他为政府和其他官方机构雕刻并印刷地图,还制作了各种不同 的商用地图和地图集,尤其是北美洲地图。地图制图师的工作引发了他调研当地民族服饰的兴趣, 这一兴趣在这套服饰集里体现得淋漓尽致。 着迷于远方的大陆,为了消遣而去旅行,这在18世纪晚期还是相对新鲜的现象,而像这套服 饰集这样的合集在当时非常流行,向观光客和足不出户的“游客”介绍其他国家的居民。Jefferys 著作中异彩纷呈的图画生动地描绘了200年前世界各国的特色。自那以后,服饰文化发生了变化, 各个国家与地区之间一度非常丰富的多样性已逐渐消失。现在,不同大洲的居民往往很难通过服 饰来分辨了。也许,我们该乐观一点儿,我们用文化和视觉上的多样性换来了更多样的人生,或 者说是更多样、更有趣、更智能的科技人生。
Page
11
关于本书 3 1 2 3 4 5 8 10 11 9 6 7 在很难从外观上分辨不同计算机读物的年代里,Manning出版社脱颖而出,在图书封面上采 用了两个世纪以前各地居民丰富多样的形象,以此体现了计算机行业别出心裁、独具创新的特性。 这些都得归功于Jeffreys的绘画。 电子书 扫描如下二维码,即可购买本书电子版。
Page
12
2 前 言 致 谢 本书将告诉你Spring Boot如何自动处理应用程序幕后的各种杂事,让你专注于做那些使应用 程序独特的工作。从很多方面来说,这和本书的诞生经历非常类似。很多人帮我操心了不少事情, 让我能专心撰写本书的内容。我要感谢Manning出版社的Cynthia Kane、Robert Casazza、Andy Carroll、Corbin Collins、Kevin Sullivan、Mary Piergies、Janet Vail、Ozren Harlovic以及Candace Gillhoolley,他们做了很多幕后工作。 编写测试能让你知道自己的软件是否实现了目标。同样,很多人在本书撰写过程中就审稿并 提供了反馈意见,他们让我确信本书没有偏离方向。为此,我要感谢Aykut Acikel、Bachir Chihani、 Eric Kramer、Francesco Persico、Furkan Kamaci、Gregor Zurowski、Mario Arias、Michael A. Angelo、 Mykel Alvis、Norbert Kuchenmeister、Phil Whiles、Raphael Villela、Sam Kreter、Travis Nelson、 Wilfredo R. Ronsini Jr.以及William Fly。还要特别感谢John Guthrie在原稿即将付印前的最终技术 审校,也感谢Andrew Glover为本书作序。 当然,如果没有Spring团队中各位天才成员的杰出工作,本书就不可能也不必问世。你们太 棒了!能成为改变软件开发方式的团队的成员,我十分激动。 我还要感谢所有参加了No Fluff/Just Stuff活动①的人,无论是演讲嘉宾还是出席的听众。我们 之间的对话某种程度上也促成了本书。 没有那些组成文字的字母,像这样的书也不可能出现。因此,就和我之前的书一样,我想借 此机会感谢发明第一个字母表的腓尼基人。 最后,我要隆重感谢我的挚爱,我美丽的妻子Raymie,还有我了不起的女儿Maisy和Madi。 你们又一次忍受我从事一个写作项目。现在,书写完了,我们该去迪士尼世界了,你们说呢? —————————— ① 这是一个面向JVM软件开发者的活动,详见https://nofluffjuststuff.com。——译者注
Page
13
目 录 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 17 目 录 第 1 章 入门 ................................................ 1 1.1 Spring 风云再起 ........................................ 1 1.1.1 重新认识 Spring ............................ 2 1.1.2 Spring Boot 精要 ........................... 3 1.1.3 Spring Boot 不是什么 ................... 6 1.2 Spring Boot 入门 ....................................... 6 1.2.1 安装 Spring Boot CLI .................... 7 1.2.2 使用 Spring Initializr 初始化 Spring Boot 项目 .......................... 10 1.3 小结 ......................................................... 18 第 2 章 开发第一个应用程序 .................... 19 2.1 运用 Spring Boot ..................................... 19 2.1.1 查看初始化的 Spring Boot 新项目 .......................................... 21 2.1.2 Spring Boot 项目构建过程 解析 .............................................. 24 2.2 使用起步依赖 .......................................... 27 2.2.1 指定基于功能的依赖 ................... 28 2.2.2 覆盖起步依赖引入的传递依赖 .... 29 2.3 使用自动配置 .......................................... 30 2.3.1 专注于应用程序功能 ................... 31 2.3.2 运行应用程序 .............................. 36 2.3.3 刚刚发生了什么 ........................... 38 2.4 小结 ......................................................... 41 第 3 章 自定义配置 .................................... 42 3.1 覆盖 Spring Boot 自动配置 ..................... 42 3.1.1 保护应用程序 .............................. 43 3.1.2 创建自定义的安全配置 ............... 44 3.1.3 掀开自动配置的神秘面纱 ........... 48 3.2 通过属性文件外置配置 ........................... 49 3.2.1 自动配置微调 .............................. 50 3.2.2 应用程序 Bean 的配置外置 ......... 55 3.2.3 使用 Profile 进行配置 .................. 59 3.3 定制应用程序错误页面 ........................... 62 3.4 小结 ......................................................... 64 第 4 章 测试 ............................................... 66 4.1 集成测试自动配置 .................................. 66 4.2 测试 Web 应用程序 ................................. 68 4.2.1 模拟 Spring MVC ........................ 69 4.2.2 测试 Web 安全 ............................. 72 4.3 测试运行中的应用程序 ........................... 74 4.3.1 用随机端口启动服务器 ............... 75 4.3.2 使用 Selenium 测试 HTML 页面 ............................................. 76 4.4 小结 ......................................................... 78 第 5 章 Groovy 与 Spring Boot CLI ......... 80 5.1 开发 Spring Boot CLI 应用程序 .............. 80 5.1.1 设置 CLI 项目 .............................. 81 5.1.2 通过 Groovy 消除代码噪声 ......... 81 5.1.3 发生了什么 .................................. 85 5.2 获取依赖 .................................................. 86 5.2.1 覆盖默认依赖版本 ....................... 87 5.2.2 添加依赖仓库 .............................. 88 5.3 用 CLI 运行测试 ...................................... 89 5.4 创建可部署的产物 .................................. 91 5.5 小结 ......................................................... 91 第 6 章 在 Spring Boot 中使用 Grails ...... 93 6.1 使用 GORM 进行数据持久化 ................. 93
Page
14
2 目 录 6.2 使用 Groovy Server Pages 定义视图 ....... 98 6.3 结合 Spring Boot 与 Grails 3 ................. 100 6.3.1 创建新的 Grails 项目 ................. 100 6.3.2 定义领域模型 ............................ 103 6.3.3 开发 Grails 控制器 ..................... 104 6.3.4 创建视图 .................................... 105 6.4 小结 ....................................................... 107 第 7 章 深入 Actuator .............................. 108 7.1 揭秘 Actuator 的端点 ............................ 108 7.1.1 查看配置明细 ............................ 109 7.1.2 运行时度量 ................................ 115 7.1.3 关闭应用程序 ............................ 121 7.1.4 获取应用信息 ............................ 121 7.2 连接 Actuator 的远程 shell .................... 122 7.2.1 查看 autoconfig 报告 ........... 123 7.2.2 列出应用程序的 Bean ............... 124 7.2.3 查看应用程序的度量信息 ......... 124 7.2.4 调用 Actuator 端点 .................... 125 7.3 通过 JMX 监控应用程序 ....................... 126 7.4 定制 Actuator......................................... 128 7.4.1 修改端点 ID ............................... 128 7.4.2 启用和禁用端点 ........................ 129 7.4.3 添加自定义度量信息 ................. 129 7.4.4 创建自定义跟踪仓库 ................. 132 7.4.5 插入自定义健康指示器 ............. 134 7.5 保护 Actuator 端点 ................................ 136 7.6 小结 ....................................................... 138 第 8 章 部署 Spring Boot 应用程序 ........ 139 8.1 衡量多种部署方式 ................................ 139 8.2 部署到应用服务器 ................................ 140 8.2.1 构建 WAR 文件 ......................... 141 8.2.2 创建生产 Profile ........................ 142 8.2.3 开启数据库迁移 ........................ 145 8.3 推上云端 ............................................... 150 8.3.1 部署到 Cloud Foundry ............... 150 8.3.2 部署到 Heroku ........................... 153 8.4 小结 ....................................................... 155 附录 A Spring Boot 开发者工具.............. 157 附录 B Spring Boot 起步依赖 ................. 163 附录 C 配置属性 ...................................... 169 附录 D Spring Boot 依赖 ......................... 202
Page
15
1.1 Spring 风云再起 1 1 2 3 4 5 6 7 8 入 门 本章内容 Spring Boot简化Spring应用程序开发 Spring Boot的基本特性 Spring Boot工作区的设置 Spring Framework已有十余年的历史了,已成为Java应用程序开发框架的事实标准。在如此 悠久的历史背景下,有人可能会认为Spring放慢了脚步,躺在了自己的荣誉簿上,再也做不出什 么新鲜的东西,或者是让人激动的东西。甚至有人说,Spring是遗留项目,是时候去看看其他创 新的东西了。 这些人说得不对。 Spring的生态圈里正在出现很多让人激动的新鲜事物,涉及的领域涵盖云计算、大数据、无 模式的数据持久化、响应式编程以及客户端应用程序开发。 在过去的一年多时间里,最让人兴奋、回头率最高、最能改变游戏规则的东西,大概就是Spring Boot了。Spring Boot提供了一种新的编程范式,能在最小的阻力下开发Spring应用程序。有了它, 你可以更加敏捷地开发Spring应用程序,专注于应用程序的功能,不用在Spring的配置上多花功 夫,甚至完全不用配置。实际上,Spring Boot的一项重要工作就是让Spring不再成为你成功路上 的绊脚石。 本书将探索Spring Boot开发的诸多方面,但在开始前,我们先大概了解一下Spring Boot的 功能。 1.1 Spring 风云再起 Spring诞生时是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品。无需 开发重量级的Enterprise JavaBean(EJB),Spring为企业级Java开发提供了一种相对简单的方法,通 过依赖注入和面向切面编程,用简单的Java对象(Plain Old Java Object,POJO)实现了EJB的功能。 虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring用XML配置, 而且是很多XML配置。Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身 第 1 章
Page
16
2 第 1 章 入 门 组件的显式XML配置。Spring 3.0引入了基于Java的配置,这是一种类型安全的可重构配置方式, 可以代替XML。 尽管如此,我们依旧没能逃脱配置的魔爪。开启某些Spring特性时,比如事务管理和Spring MVC,还是需要用XML或Java进行显式配置。启用第三方库时也需要显式配置,比如基于 Thymeleaf的Web视图。配置Servlet和过滤器(比如Spring的DispatcherServlet)同样需要在 web.xml或Servlet初始化代码里进行显式配置。组件扫描减少了配置量,Java配置让它看上去简洁 不少,但Spring还是需要不少配置。 所有这些配置都代表了开发时的损耗。因为在思考Spring特性配置和解决业务问题之间需要 进行思维切换,所以写配置挤占了写应用程序逻辑的时间。和所有框架一样,Spring实用,但与 此同时它要求的回报也不少。 除此之外,项目的依赖管理也是件吃力不讨好的事情。决定项目里要用哪些库就已经够让人 头痛的了,你还要知道这些库的哪个版本和其他库不会有冲突,这难题实在太棘手。 并且,依赖管理也是一种损耗,添加依赖不是写应用程序代码。一旦选错了依赖的版本,随 之而来的不兼容问题毫无疑问会是生产力杀手。 Spring Boot让这一切成为了过去。 1.1.1 重新认识 Spring 假设你受命用Spring开发一个简单的Hello World Web应用程序。你该做什么?我能想到一些 基本的需要。 一个项目结构,其中有一个包含必要依赖的Maven或者Gradle构建文件,最起码要有Spring MVC和Servlet API这些依赖。 一个web.xml文件(或者一个WebApplicationInitializer实现),其中声明了Spring 的DispatcherServlet。 一个启用了Spring MVC的Spring配置。 一个控制器类,以“Hello World”响应HTTP请求。 一个用于部署应用程序的Web应用服务器,比如Tomcat。 最让人难以接受的是,这份清单里只有一个东西是和Hello World功能相关的,即控制器,剩 下的都是Spring开发的Web应用程序必需的通用样板。既然所有Spring Web应用程序都要用到它 们,那为什么还要你来提供这些东西呢? 假设这里只需要控制器。代码清单1-1所示基于Groovy的控制器类就是一个简单而完整的 Spring应用程序。 代码清单1-1 一个完整的基于Groovy的Spring应用程序 @RestController class HelloController { @RequestMapping("/")
Page
17
1.1 Spring 风云再起 3 1 2 3 4 5 6 7 8 def hello() { return "Hello World" } } 这里没有配置,没有web.xml,没有构建说明,甚至没有应用服务器,但这就是整个应用程 序了。Spring Boot会搞定执行应用程序所需的各种后勤工作,你只要搞定应用程序的代码就好。 假设你已经装好了Spring Boot的命令行界面(Command Line Interface,CLI),可以像下面这 样在命令行里运行HelloController: $ spring run HelloController.groovy 想必你已经注意到了,这里甚至没有编译代码,Spring Boot CLI可以运行未经编译的代码。 之所以选择用Groovy来写这个控制器示例,是因为Groovy语言的简洁与Spring Boot的简洁有 异曲同工之妙。但Spring Boot并不强制要求使用Groovy。实际上,本书中的很多代码都是用Java 写的,但在恰当的时候,偶尔也会出现一些Groovy代码。 不要客气,直接跳到1.2.1节吧,看看如何安装Spring Boot CLI,这样你就能试着编写这个小 小的Web应用程序了。现在,你将看到Spring Boot的关键部分,看到它是如何改变Spring应用程 序的开发方式的。 1.1.2 Spring Boot 精要 Spring Boot将很多魔法带入了Spring应用程序的开发之中,其中最重要的是以下四个核心。 自动配置:针对很多Spring应用程序常见的应用功能,Spring Boot能自动提供相关配置。 起步依赖:告诉Spring Boot需要什么功能,它就能引入需要的库。 命令行界面:这是Spring Boot的可选特性,借此你只需写代码就能完成完整的应用程序, 无需传统项目构建。 Actuator:让你能够深入运行中的Spring Boot应用程序,一探究竟。 每一个特性都在通过自己的方式简化Spring应用程序的开发。本书会探寻如何将它们发挥到 极致,但就目前而言,先简单看看它们都提供了哪些功能吧。 1. 自动配置 在任何Spring应用程序的源代码里,你都会找到Java配置或XML配置(抑或两者皆有),它们 为应用程序开启了特定的特性和功能。举个例子,如果你写过用JDBC访问关系型数据库的应用 程序,那你一定在Spring应用程序上下文里配置过JdbcTemplate这个Bean。我打赌那段配置看 起来是这样的: @Bean public JdbcTemplate jdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); }
Page
18
4 第 1 章 入 门 这段非常简单的Bean声明创建了一个JdbcTemplate的实例,注入了一个DataSource依赖。当 然,这意味着你还需要配置一个DataSource的Bean,这样才能满足依赖。假设你将配置一个嵌 入式H2数据库作为DataSource Bean,完成这个配置场景的代码大概是这样的: @Bean public DataSource dataSource() { return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.H2) .addScripts('schema.sql', 'data.sql') .build(); } 这个Bean配置方法创建了一个嵌入式数据库,并指定在该数据库上执行两段SQL脚本。build() 方法返回了一个指向该数据库的引用。 这两个Bean配置方法都不复杂,也不是很长,但它们只是典型Spring应用程序配置的一小部 分。除此之外,还有无数Spring应用程序有着完全相同的方法。所有需要用到嵌入式数据库和 JdbcTemplate的应用程序都会用到那些方法。简而言之,这就是一个样板配置。 既然它如此常见,那为什么还要你去写呢? Spring Boot会为这些常见配置场景进行自动配置。如果Spring Boot在应用程序的Classpath里 发 现 H2 数 据 库 的 库 , 那 么 它 就 自 动 配 置 一 个 嵌 入 式 H2 数 据 库 。 如 果 在 Classpath 里 发 现 JdbcTemplate,那么它还会为你配置一个JdbcTemplate的Bean。你无需操心那些Bean的配置, Spring Boot会做好准备,随时都能将其注入到你的Bean里。 Spring Boot的自动配置远不止嵌入式数据库和JdbcTemplate,它有大把的办法帮你减轻配 置负担,这些自动配置涉及Java持久化API(Java Persistence API,JPA)、Thymeleaf模板、安全和 Spring MVC。第2章会深入讨论自动配置这个话题。 2. 起步依赖 向项目中添加依赖是件富有挑战的事。你需要什么库?它的Group和Artifact是什么?你需要 哪个版本?哪个版本不会和项目中的其他依赖发生冲突? Spring Boot通过起步依赖为项目的依赖管理提供帮助。起步依赖其实就是特殊的Maven依 赖和Gradle依赖,利用了传递依赖解析,把常用库聚合在一起,组成了几个为特定功能而定制 的依赖。 举个例子,假设你正在用Spring MVC构造一个REST API,并将JSON(JavaScript Object Notation)作为资源表述。此外,你还想运用遵循JSR-303规范的声明式校验,并使用嵌入式的 Tomcat服务器来提供服务。要实现以上目标,你在Maven或Gradle里至少需要以下8个依赖: org.springframework:spring-core org.springframework:spring-web org.springframework:spring-webmvc com.fasterxml.jackson.core:jackson-databind org.hibernate:hibernate-validator
Page
19
1.1 Spring 风云再起 5 1 2 3 4 5 6 7 8 org.apache.tomcat.embed:tomcat-embed-core org.apache.tomcat.embed:tomcat-embed-el org.apache.tomcat.embed:tomcat-embed-logging-juli 不过,如果打算利用Spring Boot的起步依赖,你只需添加Spring Boot的Web起步依赖 (org.springframework.boot:spring-boot-starter-web)①,仅此一个。它会根据依赖 传递把其他所需依赖引入项目里,你都不用考虑它们。 比起减少依赖数量,起步依赖还引入了一些微妙的变化。向项目中添加了Web起步依赖,实 际上指定了应用程序所需的一类功能。因为应用是个Web应用程序,所以加入了Web起步依赖。 与之类似,如果应用程序要用到JPA持久化,那么就可以加入jpa起步依赖。如果需要安全功能, 那就加入security起步依赖。简而言之,你不再需要考虑支持某种功能要用什么库了,引入相关起 步依赖就行。 此外,Spring Boot的起步依赖还把你从“需要这些库的哪些版本”这个问题里解放了出来。 起步依赖引入的库的版本都是经过测试的,因此你可以完全放心,它们之间不会出现不兼容的 情况。 和自动配置一样,第2章就会深入讨论起步依赖。 3. 命令行界面 除了自动配置和起步依赖,Spring Boot还提供了一种很有意思的新方法,可以快速开发Spring 应用程序。正如之前在1.1节里看到的那样,Spring Boot CLI让只写代码即可实现应用程序成为可能。 Spring Boot CLI利用了起步依赖和自动配置,让你专注于代码本身。不仅如此,你是否注意 到代码清单1-1里没有import?CLI如何知道RequestMapping和RestController来自哪个包 呢?说到这个问题,那些类最终又是怎么跑到Classpath里的呢? 说得简单一点,CLI能检测到你使用了哪些类,它知道要向Classpath中添加哪些起步依赖才 能让它运转起来。一旦那些依赖出现在Classpath中,一系列自动配置就会接踵而来,确保启用 DispatcherServlet和Spring MVC,这样控制器就能响应HTTP请求了。 Spring Boot CLI是Spring Boot的非必要组成部分。虽然它为Spring带来了惊人的力量,大大 简化了开发,但也引入了一套不太常规的开发模型。要是这种开发模型与你的口味相去甚远,那 也没关系,抛开CLI,你还是可以利用Spring Boot提供的其他东西。不过如果喜欢CLI,你一定想 看看第5章,其中深入探讨了Spring Boot CLI。 4. Actuator Spring Boot的最后一块“拼图”是Actuator,其他几个部分旨在简化Spring开发,而Actuator 则要提供在运行时检视应用程序内部情况的能力。安装了Actuator就能窥探应用程序的内部情况 了,包括如下细节: Spring应用程序上下文里配置的Bean —————————— ① Spring Boot起步依赖基本都以spring-boot-starter打头,随后是直接代表其功能的名字,比如web、test, 下文出现起步依赖的名字时,可能就直接用其前缀后的单词来表示了。——译者注
Page
20
6 第 1 章 入 门 Spring Boot的自动配置做的决策 应用程序取到的环境变量、系统属性、配置属性和命令行参数 应用程序里线程的当前状态 应用程序最近处理过的HTTP请求的追踪情况 各种和内存用量、垃圾回收、Web请求以及数据源用量相关的指标 Actuator通过Web端点和shell界面向外界提供信息。如果要借助shell界面,你可以打开SSH (Secure Shell),登入运行中的应用程序,发送指令查看它的情况。 第7章会详细探索Actuator的功能。 1.1.3 Spring Boot 不是什么 因为Spring Boot实在是太惊艳了,所以过去一年多的时间里有不少和它相关的言论。原先听 到或看到的东西可能给你造成了一些误解,继续学习本书前应该先澄清这些误会。 首先,Spring Boot不是应用服务器。这个误解是这样产生的:Spring Boot可以把Web应用程 序变为可自执行的JAR文件,不用部署到传统Java应用服务器里就能在命令行里运行。Spring Boot 在应用程序里嵌入了一个Servlet容器(Tomcat、Jetty或Undertow),以此实现这一功能。但这是 内嵌的Servlet容器提供的功能,不是Spring Boot实现的。 与之类似,Spring Boot也没有实现诸如JPA或JMS(Java Message Service,Java消息服务)之 类的企业级Java规范。它的确支持不少企业级Java规范,但是要在Spring里自动配置支持那些特 性的Bean。例如,Spring Boot没有实现JPA,不过它自动配置了某个JPA实现(比如Hibernate)的 Bean,以此支持JPA。 最后,Spring Boot没有引入任何形式的代码生成,而是利用了Spring 4的条件化配置特性, 以及Maven和Gradle提供的传递依赖解析,以此实现Spring应用程序上下文里的自动配置。 简而言之,从本质上来说,Spring Boot就是Spring,它做了那些没有它你自己也会去做的Spring Bean配置。谢天谢地,幸好有Spring,你不用再写这些样板配置了,可以专注于应用程序的逻辑, 这些才是应用程序独一无二的东西。 现在,你应该对Spring Boot有了大概的认识,是时候构建你的第一个Spring Boot应用程序了。 先从重要的事情开始,该怎么入手呢? 1.2 Spring Boot 入门 从根本上来说,Spring Boot的项目只是普通的Spring项目,只是它们正好用到了Spring Boot 的起步依赖和自动配置而已。因此,那些你早已熟悉的从头创建Spring项目的技术或工具,都能 用于Spring Boot项目。然而,还是有一些简便的途径可以用来开启一个新的Spring Boot项目。 最快的方法就是安装Spring Boot CLI,安装后就可以开始写代码,如代码清单1-1,接着通过 CLI来运行就好。
Comments 0
Loading comments...
Reply to Comment
Edit Comment