本書的目標是讓大家又快又好地打包學透 Spring 技術棧,內容將涉及 Spring Framework、Spring Boot、 Spring Cloud 等 Spring 家族成員。 本書分為四部分:第一部分“Spring 入門”,先學習基本的 Spring IoC、AOP,隨后過渡到當下熱門的 Spring Boot ;第二部分“Spring 中的數(shù)據(jù)操作”,其中既有常規(guī)的 SQL、NoSQL 數(shù)據(jù)操作,也有進階的數(shù)據(jù)源配置和緩存抽象;第三部分“使用 Spring 開發(fā) Web 應用”,講述 Spring MVC 細節(jié)的同時,也不放過 Web 安全與 REST ;第四部分“使用 Spring 開發(fā)微服務”,除了常規(guī)的 Spring Cloud 模塊,也會講解 Spring Cloud Alibaba。在講解具體內容的基本示例之外,書中還設計了一個貫穿主要章節(jié)的實戰(zhàn)案例,帶大家一步步從零開始實現(xiàn)一個靈活運用全書內容的項目“二進制奶茶店”。 本書重實戰(zhàn)、重工程現(xiàn)實,是業(yè)內專業(yè)人員丁雪豐親歷的有效學習路徑,匯集了作者多年的實戰(zhàn)經驗。跟著兔子書,只要具備 Java 基礎知識,就可以快速上手 Spring,并落地實戰(zhàn)項目和生產環(huán)境。
1.【內容全】詳細介紹Spring Boot等10+款Spring常用組件
2.【重實戰(zhàn)】注重工程實現(xiàn),書中的技術主題與業(yè)務開發(fā)強關聯(lián)
3.【本土化】貼近實際工作場景,涵蓋國內高頻使用的工具與組件
4.【大案例】“二進制奶茶店”分布式系統(tǒng)案例貫穿全書,即學即用
5.【作者強】超過15年一線開發(fā)經驗,大廠大型系統(tǒng)構建經驗豐富
6.【易學習】1個大案例 | 355段代碼 | 44回茶歇 | 178張表 | 59幅圖
丁雪豐 美團研究員、技術圖書作譯者、極客時間《玩轉Spring全家桶》課程講師。獲得了“上海市青年金才”“騰訊云價值專家”等稱號。致力于推動先進技術在國內的發(fā)展,是Spring Framework 2.0和Spring Framework 2.5官方文檔翻譯項目的負責人,翻譯及原創(chuàng)出版了《Spring Boot實戰(zhàn)》《Spring攻略》《RESTful Web Services Cookbook中文版》等8部圖書。曾就職于平安壹錢包、百度與,在互聯(lián)網金融、支付等領域積累了豐富的大型系統(tǒng)構建經驗。
第 一部分 Spring入門
第 1章 初識 Spring 2
1.1 認識 Spring 家族 2
1.1.1 Spring 發(fā)展歷史 2
1.1.2 Spring 家族主要成員 4
1.2 編寫第 一個 Spring 程序 7
1.2.1 基礎環(huán)境準備 8
1.2.2 通過Spring Initializr創(chuàng)建工程 12
1.2.3 編寫簡單的REST服務 14
1.3 實戰(zhàn)案例說明 16
1.3.1 需求描述 16
1.3.2 模塊說明 17
1.4 小結 19
第 2章 Spring Framework中的IoC容器 20
2.1 IoC容器基礎知識 20
2.1.1 什么是IoC容器 20
2.1.2 容器的初始化 21
2.1.3 BeanFactory與ApplicationContext 23
2.1.4 容器的繼承關系 24
2.2 Bean基礎知識 27
2.2.1 什么是Bean 27
2.2.2 Bean的依賴關系 27
2.2.3 Bean的三種配置方式 30
2.3 定制容器與Bean的行為 33
2.3.1 Bean的生命周期 33
2.3.2 Aware接口的應用 37
2.3.3 事件機制 37
2.3.4 容器的擴展點 39
2.3.5 優(yōu)雅地關閉容器 40
茶歇時間:Linux環(huán)境下如何關閉進程 41
2.4 容器中的幾種抽象 42
2.4.1 環(huán)境抽象 42
2.4.2 任務抽象 44
茶歇時間:該怎么配置線程池 45
茶歇時間:本地調度vs.分布式調度 47
2.5 小結 47
第3章 Spring Framework中的AOP 48
3.1 Spring中的AOP 48
3.1.1 AOP的核心概念 48
3.1.2 Spring AOP的實現(xiàn)原理 49
茶歇時間:使用代理模式過程中的小坑 51
3.2 基于@AspectJ的配置 52
3.2.1 聲明切入點 53
茶歇時間:Spring AOP與AspectJ中PCD的不同之處 54
3.2.2 聲明通知 55
3.2.3 基于@AspectJ的示例 57
3.3 基于XML Schema的配置 61
3.3.1 聲明切入點 62
3.3.2 聲明通知 62
3.3.3 通知器 64
3.3.4 基于XML Schema的示例 64
茶歇時間:超簡潔的JUnit單元測試入門 65
3.4 小結 66
第4章 從Spring Framework到Spring Boot 67
4.1 Spring Boot基礎知識 67
4.1.1 為什么需要Spring Boot 67
4.1.2 Spring Boot的組成部分 68
4.1.3 解析Spring Boot工程 70
4.2 起步依賴 71
4.2.1 Spring Boot內置的起步依賴 72
4.2.2 起步依賴的實現(xiàn)原理 73
4.3 自動配置 75
4.3.1 自動配置的實現(xiàn)原理 75
茶歇時間:通過ImportSelector選擇性導入配置 76
4.3.2 配置項加載機制詳解 77
4.4 編寫我們自己的自動配置與起步依賴 79
4.4.1 編寫自己的自動配置 80
4.4.2 脫離Spring Boot實現(xiàn)自動配置 83
4.4.3 編寫自己的起步依賴 87
4.5 小結 88
第5章 面向生產的Spring Boot 89
5.1 Spring Boot Actuator概述 89
5.1.1 端點概覽 89
5.1.2 端點配置 92
茶歇時間:針對Web和Actuator使用不同端口的好處 95
5.1.3 定制端點信息 96
5.1.4 開發(fā)自己的組件與端點 98
茶歇時間:為什么要優(yōu)先通過ObjectProvider獲取Bean 100
5.2 基于Micrometer的系統(tǒng)度量 101
5.2.1 Micrometer概述 102
5.2.2 常用度量指標 103
5.2.3 自定義度量指標 107
茶歇時間:性能分析時的95線與99線是什么含義 110
5.2.4 度量值的輸出 111
5.3 部署Spring Boot應用程序 112
5.3.1 可執(zhí)行Jar及其原理 112
5.3.2 構建啟動代碼 115
茶歇時間:如何優(yōu)雅地關閉系統(tǒng) 117
5.3.3 啟動后的一次性執(zhí)行邏輯 118
茶歇時間:通過Lombok簡化代碼 121
5.4 小結 122
第二部分 Spring中的數(shù)據(jù)操作
第6章 Spring中的JDBC 124
6.1 配置數(shù)據(jù)源 124
6.1.1 數(shù)據(jù)庫連接池 124
茶歇時間:HikariCP為什么說自己比別人快 127
6.1.2 數(shù)據(jù)源配置詳解 128
茶歇時間:使用Docker簡化本地開發(fā)環(huán)境的準備工作 133
6.2 使用JDBC操作數(shù)據(jù)庫 134
6.2.1 查詢類操作 135
6.2.2 變更類操作 139
6.2.3 批處理操作 141
6.2.4 自動配置說明 143
6.3 事務管理 143
6.3.1 Spring Framework的事務抽象 144
6.3.2 Spring事務的基本配置 146
6.3.3 聲明式事務 148
茶歇時間:通常事務加在哪層比較合適 151
茶歇時間:聲明式事務背后的原理 153
6.3.4 編程式事務 154
6.4 異常處理 155
6.4.1 統(tǒng)一的異常抽象 155
6.4.2 自定義錯誤碼處理邏輯 157
6.5 小結 158
第7章 對象關系映射 160
7.1 通過Hibernate操作數(shù)據(jù)庫 160
7.1.1 Hibernate與JPA 160
7.1.2 定義實體對象 162
茶歇時間:為什么一定要用Money類來表示金額 165
茶歇時間:OpenSessionInView問題 168
7.1.3 通過Hibernate API操作數(shù)據(jù)庫 169
7.1.4 通過Spring Data的Repository操作數(shù)據(jù)庫 173
茶歇時間:JpaRepository背后的原理 178
7.2 通過MyBatis操作數(shù)據(jù)庫 179
7.2.1 定義MyBatis映射 180
7.2.2 在Spring中配置并使用MyBatis 184
7.2.3 提升MyBatis的開發(fā)效率 187
7.3 小結 193
第8章 數(shù)據(jù)訪問進階 194
8.1 連接池的實用配置 194
8.1.1 保護敏感的連接配置 194
8.1.2 記錄SQL語句執(zhí)行情況 197
8.1.3 Druid的Filter擴展 200
8.2 在Spring工程中訪問Redis 202
8.2.1 配置Redis連接 202
茶歇時間:Redis的幾種部署模式 204
8.2.2 Redis的基本操作 206
茶歇時間:本地緩存 vs. 分布式緩存 212
8.2.3 通過Repository操作Redis 212
茶歇時間:多種不同的Repository如何共存 216
8.3 Spring的緩存抽象 217
8.3.1 基于注解的方法緩存 217
8.3.2 替換不同的緩存實現(xiàn) 221
8.4 小結 224
第三部分 使用Spring開發(fā)Web應用
第9章 Spring MVC實踐 226
9.1 簡單上手Spring MVC 226
9.1.1 Spring MVC概覽 226
9.1.2 編寫一個簡單的控制器 227
9.2 Spring MVC的請求處理邏輯 234
9.2.1 請求的處理流程 234
茶歇時間:Servlet的基礎知識 240
9.2.2 請求處理方法 241
茶歇時間:請求處理過程中遇到的幾個作用范圍 243
茶歇時間:Spring Boot自動配置
預埋的擴展點 245
9.3 Spring MVC的視圖機制 252
9.3.1 視圖解析 252
9.3.2 常用視圖類型 253
9.3.3 靜態(tài)資源與緩存 260
茶歇時間:時間 vs. 空間 263
9.4 訪問Web資源 264
9.4.1 通過RestTemplate訪問Web資源 264
9.4.2 RestTemplate的進階用法 270
茶歇時間:模板設計模式 275
9.4.3 簡單定制RestTemplate 275
茶歇時間:HttpComponents的Keep-Alive默認策略優(yōu)化 277
9.5 小結 278
第 10章 保護Web安全 279
10.1 認識Spring Security 279
10.1.1 模塊介紹 280
10.1.2 工作原理 280
10.2 身份認證 282
10.2.1 Spring Security的身份認證機制 282
10.2.2 基于用戶名和密碼的身份認證 283
茶歇時間:使用Spring Security加密保存密碼 284
10.2.3 實現(xiàn)“記住我”功能 294
10.2.4 自定義認證方式 298
10.3 訪問授權 303
10.3.1 訪問授權的判斷方式 303
10.3.2 基本的權限配置 304
10.3.3 面向方法的訪問授權 308
茶歇時間:如何忽略權限校驗 310
10.4 常見Web攻擊防護 311
10.4.1 跨站請求偽造攻擊防護 311
10.4.2 會話固定攻擊防護 316
10.4.3 跨站腳本攻擊防護 316
10.4.4 點擊劫持攻擊防護 317
10.4.5 引導使用HTTPS 317
10.5 客戶端程序的認證 319
10.5.1 幾種常見的認證方式 319
10.5.2 用RestTemplate實現(xiàn)簡單的認證 320
10.6 小結 323
第 11章 Web開發(fā)進階 325
11.1 在Spring MVC中實現(xiàn)AOP 325
11.1.1 使用HandlerInterceptor實現(xiàn)AOP 325
11.1.2 完善異常處理邏輯 329
11.2 調整Web容器 333
11.2.1 更換內嵌Web容器 334
茶歇時間:不同的Servlet版本與對應的容器 335
11.2.2 調整內嵌Web容器配置 335
茶歇時間:如何獲得HTTPS證書 338
11.2.3 支持HTTP/2 341
茶歇時間:網站提供的HTTPS服務到底是否安全 345
11.3 支持分布式Session 346
11.3.1 幾種常見的解決方案 346
11.3.2 使用Spring Session實現(xiàn)分布式Session 348
11.4 響應式Web 353
11.4.1 了解Project Reactor 354
11.4.2 使用WebFlux代替WebMVC 359
茶歇時間:為什么Project Reactor和WebFlux還沒成為主流 363
11.4.3 通過WebClient訪問Web資源 366
11.5 小結 371
第四部分 使用Spring開發(fā)微服務
第 12章 微服務與云原生應用 374
12.1 走近微服務 374
12.1.1 什么是微服務 374
12.1.2 微服務的特點 375
12.2 RESTful風格的微服務 377
12.2.1 什么是RESTful風格的微服務 377
12.2.2 設計RESTful風格的微服務 379
12.2.3 了解領域驅動設計 383
12.3 理解云原生 385
12.3.1 什么是云原生應用 385
12.3.2 十二要素應用 386
12.3.3 Spring Cloud概述 390
12.4 小結 391
第 13章 服務注冊與發(fā)現(xiàn) 392
13.1 常見的負載均衡方案 392
13.1.1 集中式方案 392
13.1.2 分布式方案 395
13.2 使用Spring Cloud實現(xiàn)負載均衡 396
13.2.1 在Zookeeper中注冊服務 396
茶歇時間:為什么Zookeeper不適合做服務注冊中心 398
13.2.2 使用Spring Cloud LoadBalancer訪問服務 398
茶歇時間:@LoadBalanced是如何工作的 399
13.2.3 使用OpenFeign訪問服務 400
13.3 服務注冊與發(fā)現(xiàn)的抽象與應用 405
13.3.1 服務注冊的抽象 405
13.3.2 服務發(fā)現(xiàn)的抽象 406
13.3.3 在Consul中注冊服務 406
13.3.4 在Nacos中注冊服務 408
茶歇時間:Spring Cloud Alibaba概述 411
13.3.5 在Eureka中注冊服務 411
13.4 小結 414
第 14章 服務配置管理 415
14.1 使用Spring Cloud Config實現(xiàn)配置管理 415
14.1.1 為何需要配置中心 415
14.1.2 基于Spring Cloud Config Server的配置中心 416
茶歇時間:加解密繞不開的JCE 423
14.1.3 通過Spring Cloud Config Client訪問配置 423
14.2 服務配置的實現(xiàn)原理與應用 426
14.2.1 服務配置的實現(xiàn)原理 426
14.2.2 基于Zookeeper的配置中心 429
14.2.3 基于Consul的配置中心 431
14.2.4 基于Alibaba Nacos的配置中心 433
14.3 小結 436
第 15章 服務容錯保護 437
15.1 常見的服務容錯模式 437
15.1.1 幾種常見的容錯模式 437
15.1.2 通過AOP實現(xiàn)簡單的容錯 440
15.2 使用Resilience4j實現(xiàn)容錯 447
15.2.1 使用Resilience4j實現(xiàn)限流 447
15.2.2 使用Resilience4j實現(xiàn)斷路 453
15.2.3 使用Resilience4j實現(xiàn)隔離 457
15.2.4 resilience4j-spring-boot2的特別說明 461
15.3 使用Spring Cloud CircuitBreaker實現(xiàn)容錯 462
15.3.1 通過Spring Cloud CircuitBreaker使用Resilience4j 463
15.3.2 通過Spring Cloud CircuitBreaker使用Sentinel 466
15.4 小結 476
第 16章 服務集成 477
16.1 使用Dubbo進行RPC通信 477
16.1.1 Dubbo概述 477
16.1.2 Dubbo的基礎用法 479
茶歇時間:多個copyProperties()該如何選擇 482
茶歇時間:為什么對外的接口里不要用枚舉 484
16.2 使用消息中間件進行異步通信 488
16.2.1 為什么要使用基于消息的異步通信 488
茶歇時間:常見的消息模型 489
16.2.2 通過Spring AMQP使用RabbitMQ 489
16.2.3 通過Spring Cloud Stream使用Kafka 495
茶歇時間:用Docker Compose在本地啟動一套Kafka 501
16.3 服務鏈路追蹤 502
16.3.1 鏈路追蹤概述 503
16.3.2 基于Spring Cloud Sleuth實現(xiàn)鏈路追蹤 505
茶歇時間:OpenTelemetry概述 509
16.4 基于Spring Cloud Gateway實現(xiàn)微服務網關 510
16.4.1 什么是微服務網關 510
16.4.2 Spring Cloud Gateway的路由配置 512
16.5 小結 522
第五部分 附錄
附錄A 從Spring Boot 2.x升級到3.0 526
A.1 升級判斷標準 526
A.2 升級操作 526
A.2.1 依賴組件升級 527
A.2.2 代碼修改 529
附錄B 將應用程序打包為Docker鏡像 531
B.1 編寫Dockerfile 531
茶歇時間:如何選擇基礎Java Docker鏡像 532
B.2 構建并運行鏡像 533
B.3 構建分層鏡像 534
B.4 其他打包方式 535
附錄C 通過Spring Native打包本地鏡像 536
C.1 GraalVM與Spring Native 536
C.1.1 GraalVM簡介 536
C.1.2 Spring Native簡介 537
C.2 編譯打包本地鏡像 538
C.2.1 準備工作 538
C.2.2 調整編譯打包配置 539
C.2.3 修改代碼 542
C.2.4 其他優(yōu)化 547
后記 549