编辑推荐
《Spring Boot编程思想(核心篇)》全名为《SpringBoot编程思想(核心篇》》,以SpringBoot2.0为讨论的主线,讨论的范围将涵盖SpringBoot1.x的所有版本,以及所关联的SpringFramework版本,致力于:
场景分析——掌握技术选型;
系统学习——拒绝浅尝辄止;
重视规范——了解发展趋势;
源码解读——理解设计思想;
实战演练——巩固学习成果。
内容简介
《SpringBoot编程思想(核心篇)》是《SpringBoot编程思想》的核心篇,开篇总览SpringBoot核心特性,接着讨论自动装配(Auto-Configuration)与SpringApplication。《Spring Boot编程思想(核心篇)》的讨论以SpringBoot为中心,议题发散至Spring技术栈、JSR及Java。希望透过全局的视角,帮助读者了解SpringBoot变迁的历程;经过多方的比较,帮助读者理解SpringBoot特性的原理;整合标准的规范,帮助读者掌握SpringBoot设计的哲学。
《SpringBoot编程思想(核心篇)》适合对SpringBoot感兴趣的读者阅读。
作者简介
小马哥,Java劝退师,Apache和SpringCloud等知名开源架构成员.
目录
第1部分总览SpringBoot
第1章初览SpringBoot2
1.1SpringFramework时代2
1.2SpringBoot简介3
1.3SpringBoot的特性5
1.4准备运行环境5
1.4.1装配JDK85
1.4.2装配Maven6
1.4.3装配IDE(集成开发环境)8
第2章理解独立的Spring应用9
2.1创建SpringBoot应用10
2.1.1命令行方式创建SpringBoot应用11
2.1.2图形化界面创建SpringBoot应用21
2.1.3创建SpringBoot应用可执行JAR29
2.2运行SpringBoot应用31
2.2.1执行SpringBoot应用可执行JAR32
2.2.2SpringBoot应用可执行JAR资源结构32
2.2.3FATJAR和WAR执行模块——spring-boot-loader36
2.2.4JarLauncher的实现原理40
第3章理解固化的Maven依赖58
3.1spring-boot-starter-parent与spring-boot-dependencies简介58
3.2理解spring-boot-starter-parent与spring-boot-dependencies61
第4章理解嵌入式Web容器70
4.1嵌入式ServletWeb容器71
4.1.1Tomcat作为嵌入式ServletWeb容器72
4.1.2Jetty作为嵌入式ServletWeb容器77
4.1.3Undertow作为嵌入式ServletWeb容器80
4.2嵌入式ReactiveWeb容器82
4.2.1UndertowServletWebServer作为嵌入式ReactiveWeb容器82
4.2.2UndertowWebServer作为嵌入式ReactiveWeb容器84
4.2.3WebServerInitializedEvent91
4.2.4Jetty作为嵌入式ReactiveWeb容器93
4.2.5Tomcat作为嵌入式ReactiveWeb容器94
第5章理解自动装配96
5.1理解@SpringBootApplication注解语义97
5.2@SpringBootApplication属性别名103
5.3@SpringBootApplication标注非引导类107
5.4@EnableAutoConfiguration激活自动装配108
5.5@SpringBootApplication“继承”@ConfigurationCGLIB提升特性110
5.6理解自动配置机制112
5.7创建自动配置类116
第6章理解Production-Ready特性119
6.1理解Production-Ready一般性定义120
6.2理解SpringBootActuator123
6.3SpringBootActuatorEndpoints124
6.4理解“外部化配置129
6.5理解“规约大于配置”132
6.6小马哥有话说134
6.6.1SpringBoot作为微服务中间件134
6.6.2SpringBoot作为SpringCloud基础设施135
6.7下一站:走向自动装配135
第2部分走向自动装配
第7章走向注解驱动编程(Annotation-Driven)138
7.1注解驱动发展史138
7.1.1注解驱动启蒙时代:SpringFramework1.x138
7.1.2注解驱动过渡时代:SpringFramework2.x139
7.1.3注解驱动黄金时代:SpringFramework3.x142
7.1.4注解驱动完善时代:SpringFramework4.x146
7.1.5注解驱动当下时代:SpringFramework5.x151
7.2Spring核心注解场景分类152
7.3Spring注解编程模型154
7.3.1元注解(Meta-Annotations)154
7.3.2Spring模式注解(StereotypeAnnotations)155
7.3.3Spring组合注解(ComposedAnnotations)187
7.3.4Spring注解属性别名和覆盖(AttributeAliasesandOverrides)195
第8章Spring注解驱动设计模式225
8.1Spring@Enable模块驱动225
8.1.1理解@Enable模块驱动225
8.1.2自定义@Enable模块驱动226
8.1.3@Enable模块驱动原理236
8.2SpringWeb自动装配250
8.2.1理解Web自动装配250
8.2.2自定义Web自动装配254
8.2.3Web自动装配原理258
8.3Spring条件装配270
8.3.1理解配置条件装配271
8.3.2自定义配置条件装配274
8.3.3配置条件装配原理277
第9章SpringBoot自动装配292
9.1理解SpringBoot自动装配295
9.1.1理解@EnableAutoConfiguration296
9.1.2优雅地替换自动装配298
9.1.3失效自动装配298
9.2SpringBoot自动装配原理299
9.2.1@EnableAutoConfiguration读取候选装配组件301
9.2.2@EnableAutoConfiguration排除自动装配组件305
9.2.3@EnableAutoConfiguration过滤自动装配组件307
9.2.4@EnableAutoConfiguration自动装配事件313
9.2.5@EnableAutoConfiguration自动装配生命周期317
9.2.6@EnableAutoConfiguration排序自动装配组件324
9.2.7@EnableAutoConfiguration自动装配BasePackages332
9.3自定义SpringBoot自动装配337
9.3.1自动装配Class命名的潜规则338
9.3.2自动装配package命名的潜规则338
9.3.3自定义SpringBootStarter340
9.4SpringBoot条件化自动装配346
9.4.1Class条件注解347
9.4.2Bean条件注解358
9.4.3属性条件注解370
9.4.4Resource条件注解376
9.4.5Web应用条件注解391
9.4.6Spring表达式条件注解397
9.5小马哥有话说401
9.6下一站:理解SpringApplication402
第3部分理解SpringApplication
第10章SpringApplication初始化阶段405
10.1SpringApplication构造阶段405
10.1.1理解SpringApplication主配置类406
10.1.2SpringApplication的构造过程410
10.1.3推断Web应用类型411
10.1.4加载Spring应用上下文初始化器(ApplicationContextInitializer)412
10.1.5加载Spring应用事件监听器(ApplicationListener)415
10.1.6推断应用引导类416
10.2SpringApplication配置阶段417
10.2.1自定义SpringApplication417
10.2.2调整SpringApplication设置417
10.2.3增加SpringApplication配置源420
10.2.4调整SpringBoot外部化配置423
第11章SpringApplication运行阶段425
11.1SpringApplication准备阶段425
11.1.1理解SpringApplicationRunListeners426
11.1.2理解SpringApplicationRunListener428
11.1.3理解SpringBoot事件431
11.1.4理解Spring事件/监听机制432
11.1.5理解SpringBoot事件/监听机制492
11.1.6装配ApplicationArguments509
11.1.7准备ConfigurableEnvironment512
11.1.8创建Spring应用上下文(ConfigurableApplicationContext)512
11.1.9Spring应用上下文运行前准备516
11.2Spring应用上下文启动阶段537
11.3Spring应用上下文启动后阶段539
11.3.1afterRefresh方法签名的变化540
11.3.2afterRefresh方法语义的变化541
11.3.3SpringBoot事件ApplicationStartedEvent语义的变化543
11.3.4执行CommandLineRunner和ApplicationRunner548
第12章SpringApplication结束阶段550
12.1SpringApplication正常结束550
12.2SpringApplication异常结束555
12.2.1SpringBoot异常处理556
12.2.2错误分析报告器——FailureAnalysisReporter562
12.2.3自定义实现FailureAnalyzer和FailureAnalysisReporter564
12.2.4SpringBoot2.0重构handleRunFailure和reportFailure方法566
12.2.5SpringBoot2.0的SpringBootExceptionReporter接口567
第13章SpringBoot应用退出571
13.1SpringBoot应用正常退出572
13.1.1ExitCodeGeneratorBean生成退出码572
13.1.2ExitCodeGeneratorBean退出码使用场景576
13.2SpringBoot应用异常退出580
13.2.1ExitCodeGenerator异常使用场景582
13.2.2ExitCodeExceptionMapperBean映射异常与退出码587
13.2.3退出码用于SpringApplication异常结束589
13.3小马哥有话说594
13.4下一站:运维篇596
前言/序言
非常感谢您阅读《Spring Boot编程思想(核心篇)》,在成长道路上,我们从此不再孤单。
大约在三年前,我有幸参与全集团微服务架构的演进及基础设施的构建,在此期间痛苦和受益并存。二○一六年十二月,经朋友引荐,作为“SFDC2016杭州开发者大会”的嘉宾,进行了一场名为“微服务实践之路”的演讲,从此正式开始了我的微服务布道师之路。次年三月,segmentfault“讲堂”栏目上线,我再次受邀,作为Java讲师。同年六月二日,“Java微服务实践”系列讲座正式直播,我主讲SpringBoot和SpringCloud。无独有偶,当月正好我工作满十周年,也萌生了著书的意向,计划写一本关于SpringBoot微服务开发实践的书籍,希望借此机会与诸君分享我的微服务实践经验。然而,随后的变故将此念头变为了现实。当月九日上午,正值当差,父亲传来一通电话,告知外婆于八点左右过世,听此噩耗,悲从中来,不可断绝。即刻带着身怀六甲的妻子,启程回湘。
外婆一直陪伴着我的成长,直到我远赴杭州求职,才分隔两地。现如今祖孙二人天各一方,生死茫茫,无处话凄凉,子欲养而亲不待的痛楚莫过于此。我曾向上天祷告,愿她能安享西方极乐。若非外婆的离世,我绝对不会有坚定意志和足够勇气来完成此书,书籍的内容也不会有颠覆性的变化,讨论的议题从过去的“SpringBoot微服务开发实践”逐渐转变为“SpringBoot编程思想”。希望竭尽所能,将技术积累、学习方法、实战经验,以及所思所想和盘托出。每当自己午夜梦回,脑海中浮现外婆的容貌时,总会潸然泪下,所有的思想动摇和行为慵懒立即烟消云散。外婆是虔诚的佛教徒,平日乐善好施。从小耳濡目染的我也尽一点绵薄之力,将书籍五成以上的稿费作为公益基金,支持贫困地区的青少年教育,并且不定期地公开账目信息,供广大读者监督。这或许杯水车薪,但仍希望他们能够感到一丝温暖。
祸兮福所倚,福兮祸所伏,生死轮回,自然之理。外婆去世后的两个月,我的儿子降临人间。作为一名新晋的父亲,自然会以更高的标准来要求自己,对书籍的质量同样趋于严苛,将早期已完成的部分“付之一炬”,推倒重来,内容篇幅剧增。作为我儿的表率,著书只是“立言”的开始,捐赠作为“立德”的发端,而“立行”则需身体力行,持之以恒。或许“著作等身”是一种不错的选择,然而现代科技的进步,尤其是文字载体的革新,要做到这一点,难度实在不小。不过,“为者常成,行者常至”,实现从“小马哥”到“马三立”先生的华丽转身并非遥不可及。
已故南京大学历史系教授高华先生曾引述凯斯·詹京斯的观点,“历史乃论述过去,但绝不等于过去”。既然是论述,那么或多或少会存在偏差,不但受限于论述者的知识、能力及记忆等主观因素,而且取决于当时的时空环境。为了遵照原著,在功能特性的介绍上,《Spring Boot编程思想(核心篇)》将引述官方文档的英文原文,并做出适当的解释。由于文档的编写者或许不是代码的实现者,即使是实现者本人,也难免会站在自己的立场和高度,抑或章节安排及文字组织等诸多因素影响阅读和理解。因此,针对官方文档语焉不详的部分,《Spring Boot编程思想(核心篇)》将补充说明;对其错误的结论,将加以修正。由于本人能力和水平的局限,不敢妄言理解“格物致知”的奥义,难免有主观臆断和谬论之处,且仅一家之言,供诸君参考,切莫将此奉为圭臬,书云亦云,不假思索。老子有言,“上士闻道,勤而行之”,希望读者能学以致用,若能在实践中激发出创新的灵感,善莫大焉。
最后,借此机会,由衷地感谢我的太太,没有她背后默默地付出,我不会有如此多的精力投入,更无法专注写作。同时,向陈晓猛编辑致敬,他是一位谦谦君子,极富耐心,在书籍编写的过程中,给予我不少的帮助和鼓励。再次向各位朋友送上我诚挚的歉意,由于个人的原因,使得书籍出版时间一再跳票。
小马哥
公元二○一九年一月于杭州