內容簡介
Spring Boot是目前Java EE開發中頗受歡迎的框架之一。依託於底層Spring Framework的基礎支撐,以及完善強大的特性設計,Spring Boot已成為業界流行的套用和微服務開發基礎框架。
《Spring Boot源碼解讀與原理分析》共14章,分為4個部分。第一部分介紹Spring Boot底層依賴的核心容器,以及底層Spring Framework的兩大核心特性IOC和AOP;第二部分從底層源碼角度深入剖析Spring Boot的生命周期,包括Spring Application、IOC容器、嵌入式Web容器和AOP模組的生命周期;第三部分針對項目開發中整合的主流場景,介紹場景模組中的核心裝配和關鍵機制原理,如JDBC中的事務、Web中的核心控制器等;第四部分與Spring Boot的運行部署相關,針對不同運行場景講解Spring Boot的啟動引導方式。
閱讀《Spring Boot源碼解讀與原理分析》之前,讀者需要先對Spring Framework和Spring Boot有基本的理解與簡單的框架使用經驗或項目開發經驗。本書的重點是Spring Boot的設計、思想和原理,無論是對於已經有一定基礎的開發者還是已熟練使用Spring Boot並希望進一步提升技能和水平的開發者,本書是他們透徹研究Spring Boot源碼和原理的理想選擇。
作者簡介
LinkedBear,Java開發工程師、底層技術研究者與分享者,傾心研究Spring技術體系多年,對Spring、Spring Boot等框架有獨到的見解,擁有豐富的框架體系實踐經驗和架構封裝經驗。
圖書目錄
第 1部分 Spring Boot底層依賴的核心容器
第 1章 Spring Boot整體概述 3
1.1 Spring Framework 3
1.1.1 Spring Framework的歷史 4
1.1.2 IOC與AOP 4
1.2 Spring Boot與Spring Framework 4
1.3 Spring Boot的核心特性 5
1.4 Spring Boot的體系 5
1.5 開發第 一個Spring Boot套用 6
1.5.1 創建項目 6
1.5.2 編寫簡單代碼 10
1.6 小結 11
第 2章 Spring Boot的自動裝配 12
2.1 組件裝配 12
2.1.1 組件 12
2.1.2 手動裝配 13
2.1.3 自動裝配 13
2.2 Spring Framework的模組裝配 14
2.2.1 模組 14
2.2.2 快速體會模組裝配 15
2.2.3 導入配置類 17
2.2.4 導入ImportSelector 19
2.2.5 導入ImportBeanDefinitionRegistrar 21
2.2.6 擴展:DeferredImportSelector 22
2.3 Spring Framework的條件裝配 24
2.3.1 基於Profile的裝配 24
2.3.2 基於Conditional的裝配 26
2.4 SPI機制 28
2.4.1 JDK原生的SPI 29
2.4.2 Spring Framework 3.2的SPI 30
2.5 Spring Boot的裝配機制 32
2.5.1 @ComponentScan 33
2.5.2 @SpringBootConfiguration 34
2.5.3 @EnableAutoConfiguration 35
2.6 WebMvc場景下的自動裝配原理 42
2.6.1 Servlet容器的裝配 43
2.6.2 DispatcherServlet的裝配 46
2.6.3 SpringWebMvc的裝配 48
2.7 小結 53
第3章 Spring Boot的IOC容器 54
3.1 Spring Framework的IOC容器 54
3.1.1 BeanFactory 55
3.1.2 ApplicationContext 66
3.1.3 選擇ApplicationContext而不是BeanFactory 74
3.2 Spring Boot對IOC容器的擴展 75
3.2.1 WebServerApplicationContext 75
3.2.2 AnnotationConfigServletWebServerApplicationContext 75
3.2.3 ReactiveWebApplicationContext 76
3.3 選用註解驅動IOC容器的原因 76
3.3.1 配置方式的對比 76
3.3.2 約定大於配置下的選擇 77
3.4 Environment 77
3.4.1 Environment概述 77
3.4.2 Environment的結構與設計 78
3.4.3 Environment與IOC容器的關係 80
3.5 BeanDefinition 81
3.5.1 理解元信息 81
3.5.2 BeanDefinition概述 81
3.5.3 BeanDefinition的結構與設計 82
3.5.4 體會BeanDefinition 85
3.5.5 BeanDefinitionRegistry 88
3.5.6 設計BeanDefinition的意義 89
3.6 後置處理器 89
3.6.1 理解後置處理器 89
3.6.2 BeanPostProcessor 90
3.6.3 BeanPostProcessor的擴展 91
3.6.4 BeanFactoryPostProcessor 93
3.6.5 BeanDefinitionRegistryPostProcessor 94
3.6.6 後置處理器對比 95
3.7 IOC容器的啟動流程 95
3.8 小結 100
第4章 Spring Boot的核心引導:SpringApplication 101
4.1 總體設計 101
4.1.1 啟動失敗的錯誤報告 101
4.1.2 Bean的延遲初始化 103
4.1.3 SpringApplication的定製 103
4.1.4 Web類型推斷 104
4.1.5 監聽與回調 104
4.1.6 套用退出 106
4.2 生命周期概述 107
4.2.1 創建SpringApplication 107
4.2.2 啟動SpringApplication 107
4.2.3 套用退出 108
4.3 小結 108
第5章 Spring Boot的AOP支持 109
5.1 Spring Framework的AOP回顧 109
5.1.1 AOP術語 109
5.1.2 通知類型 110
5.2 Spring Boot使用AOP 110
5.3 AOP的開關:@EnableAspectJAutoProxy 111
5.3.1 AspectJAutoProxyRegistrar 112
5.3.2 AnnotationAwareAspectJAutoProxyCreator 114
5.4 小結 117
第 2部分 Spring Boot的生命周期原理分析
第6章 Spring Boot準備容器與環境 121
6.1 創建SpringApplication 122
6.1.1 推斷Web環境 122
6.1.2 設定初始化器 123
6.1.3 設定監聽器 125
6.1.4 確定主啟動類 126
6.1.5 與Spring Boot 1.x的區別 127
6.1.6 與Spring Boot 2.4.x的區別 128
6.2 啟動SpringApplication 129
6.2.1 前置準備 130
6.2.2 獲取SpringApplicationRunListeners 133
6.2.3 準備運行時環境 135
6.3 IOC容器的創建與初始化 137
6.3.1 列印Banner 137
6.3.2 創建IOC容器 140
6.3.3 初始化IOC容器 142
6.3.4 刷新IOC容器 145
6.3.5 Spring Boot 2.4.x的新特性 145
6.4 IOC容器刷新後的回調 148
6.5 小結 149
第7章 IOC容器的刷新 150
7.1 初始化前的預處理 152
7.1.1 初始化屬性配置 152
7.1.2 初始化早期事件的集合 154
7.2 obtainFreshBeanFactory:初始化BeanFactory 154
7.2.1 註解驅動的refreshBeanFactory 155
7.2.2 XML驅動的refreshBeanFactory 155
7.3 prepareBeanFactory:BeanFactory的預處理動作 156
7.3.1 ApplicationContextAwareProcessor 157
7.3.2 自動注入的支持 158
7.3.3 ApplicationListenerDetector 159
7.4 postProcessBeanFactory:BeanFactory的後置處理 160
7.4.1 回調父類方法 161
7.4.2 組件掃描&解析手動傳入的配置類 164
7.5 invokeBeanFactoryPostProcessors:執行BeanFactoryPostProcessor 164
7.5.1 現有的後置處理器分類 165
7.5.2 執行最高優先權的BeanDefinitionRegistryPostProcessor 165
7.5.3 執行其他BeanDefinitionRegistryPostProcessor 166
7.5.4 回調postProcessBeanFactory方法 167
7.5.5 BeanFactoryPostProcessor的分類 168
7.5.6 執行BeanFactoryPostProcessor 168
7.5.7 重要的後置處理器:ConfigurationClassPostProcessor 169
7.6 registerBeanPostProcessors:初始化BeanPostProcessor 185
7.6.1 BeanPostProcessorChecker 186
7.6.2 MergedBeanDefinitionPostProcessor被重複註冊 187
7.6.3 PriorityOrdered類型的後置處理器 188
7.7 initMessageSource:初始化國際化組件 188
7.8 initApplicationEventMulticaster:初始化事件廣播器 190
7.9 onRefresh:子類擴展的刷新動作 191
7.10 registerListeners:註冊監聽器 191
7.11 finishBeanFactoryInitialization:初始化剩餘的單例bean對象 192
7.11.1 beanFactory.preInstantiateSingletons 193
7.11.2 getBean 193
7.11.3 createBean 199
7.11.4 doCreateBean 201
7.11.5 SmartInitializingSingleton 215
7.12 finishRefresh-刷新後的動作 216
7.12.1 LifecycleProcessor 216
7.12.2 getLifecycleProcessor().onRefresh() 217
7.13 resetCommonCaches:清除快取 217
7.14 ApplicationContext初始化中的擴展點 218
7.14.1 invokeBeanFactoryPostProcessors 218
7.14.2 finishBeanFactoryInitialization 219
7.15 循環依賴的解決方案 221
7.15.1 循環依賴的產生 221
7.15.2 循環依賴的解決模型 222
7.15.3 基於setter/@Autowired的循環依賴 222
7.15.4 基於構造方法的循環依賴 230
7.15.5 基於原型Bean的循環依賴 230
7.15.6 引入AOP的額外設計 231
7.16 小結 232
第8章 Spring Boot容器刷新擴展:嵌入式Web容器 233
8.1 嵌入式Tomcat簡介 233
8.1.1 嵌入式Tomcat與普通Tomcat 234
8.1.2 Tomcat整體架構 234
8.1.3 Tomcat的核心工作流程 235
8.2 Spring Boot中嵌入式容器的模型 236
8.2.1 WebServer 236
8.2.2 WebServerFactory 236
8.2.3 ServletWebServerFactory和ReactiveWebServerFactory 237
8.2.4 ConfigurableServletWebServerFactory 237
8.3 嵌入式Web容器的初始化時機 237
8.3.1 創建WebServer 238
8.3.2 Web容器關閉相關的回調 241
8.4 嵌入式Tomcat的初始化 242
8.4.1 獲取Context 243
8.4.2 阻止Connector初始化 244
8.4.3 啟動Tomcat 244
8.4.4 阻止Tomcat結束 246
8.5 嵌入式Tomcat的啟動 248
8.6 小結 249
第9章 AOP模組的生命周期 250
9.1 @EnableAspectJAutoProxy 250
9.2 AnnotationAwareAspectJAutoProxyCreator 252
9.2.1 類繼承結構 253
9.2.2 初始化時機 253
9.2.3 作用時機 254
9.3 Advisor與切面類的收集 257
9.3.1 收集增強器的邏輯 257
9.3.2 收集原生增強器 258
9.3.3 解析AspectJ切面封裝增強器 259
9.4 TargetSource的設計 266
9.4.1 TargetSource的設計 267
9.4.2 TargetSource的好處 267
9.4.3 TargetSource的結構 267
9.4.4 Spring Framework中提供的TargetSource 268
9.5 代理對象生成的核心:wrapIfNecessary 268
9.5.1 getAdvicesAndAdvisorsForBean 269
9.5.2 createProxy 274
9.6 代理對象的底層執行邏輯 277
9.6.1 DemoService#save 277
9.6.2 獲取增強器鏈 278
9.6.3 執行增強器 281
9.6.4 jdk動態代理的執行底層 285
9.6.5 AspectJ中通知的底層實現 287
9.7 AOP通知的執行順序對比 289
9.7.1 測試代碼編寫 289
9.7.2 Spring Framework 5.x的順序 290
9.7.3 Spring Framework 4.x的順序 291
9.8 小結 292
第3部分 Spring Boot整合常用開發場景
第 10章 Spring Boot整合JDBC 295
10.1 Spring Boot整合JDBC項目搭建 295
10.1.1 初始化資料庫 295
10.1.2 整合項目 296
10.1.3 編寫測試代碼 296
10.2 整合JDBC後的自動裝配 297
10.2.1 配置數據源 298
10.2.2 創建JdbcTemplate 302
10.2.3 配置事務管理器 303
10.3 聲明式事務的生效原理 303
10.3.1 TransactionAutoConfiguration 303
10.3.2 TransactionManagementConfigurationSelector 305
10.3.3 AutoProxyRegistrar 305
10.3.4 ProxyTransactionManagementConfiguration 307
10.4 聲明式事務的控制全流程 309
10.4.1 CglibAopProxy#intercept 309
10.4.2 TransactionInterceptor 310
10.5 聲明式事務的傳播行為控制 319
10.5.1 修改測試代碼 320
10.5.2 PROPAGATION_REQUIRED 321
10.5.3 PROPAGATION_REQUIRES_NEW 327
10.6 小結 330
第 11章 Spring Boot整合MyBatis 332
11.1 MyBatis框架概述 332
11.2 Spring Boot整合MyBatis項目搭建 333
11.3 自動裝配核心 334
11.3.1 場景啟動器的秘密 334
11.3.2 MybatisLanguageDriverAutoConfiguration 335
11.3.3 MybatisAutoConfiguration 335
11.4 小結 342
第 12章 Spring Boot整合WebMvc 343
12.1 整合WebMvc的核心自動裝配 343
12.2 WebMvc的核心組件 344
12.2.1 DispatcherServlet 344
12.2.2 Handler 345
12.2.3 HandlerMapping 345
12.2.4 HandlerAdapter 347
12.2.5 ViewResolver 348
12.3 @Controller控制器裝配原理 349
12.3.1 初始化RequestMapping的入口 349
12.3.2 processCandidateBean 350
12.3.3 detectHandlerMethods 350
12.4 DispatcherServlet的工作全流程解析 352
12.4.1 DispatcherServlet#service 352
12.4.2 processRequest 353
12.4.3 doService 354
12.4.4 doDispatch 356
12.4.5 DispatcherServlet工作全流程小結 372
12.5 小結 372
第 13章 Spring Boot整合WebFlux 374
13.1 快速了解回響式編程與Reactor 374
13.1.1 命令式與回響式 374
13.1.2 概念和思想的回顧與引入 375
13.1.3 快速體會Reactor框架 377
13.2 快速使用WebFlux 380
13.2.1 WebMvc的開發風格 380
13.2.2 逐步過渡到WebFlux 381
13.2.3 WebFlux的函式式開發 382
13.2.4 WebMvc與WebFlux的對比 383
13.3 WebFlux的自動裝配 384
13.3.1 ReactiveWebServerFactoryAutoConfiguration 384
13.3.2 WebFluxAutoConfiguration 385
13.3.3 WebFluxConfig 386
13.3.4 EnableWebFluxConfiguration 387
13.3.5 WebFluxConfigurationSupport 388
13.4 DispatcherHandler的傳統方式工作原理 390
13.4.1 handle方法概覽 390
13.4.2 篩選HandlerMapping 391
13.4.3 搜尋HandlerAdapter並執行 393
13.4.4 返回值處理 394
13.4.5 工作流程小結 395
13.5 DispatcherHandler的函式式端點工作原理 396
13.5.1 HandlerMapping的不同 396
13.5.2 HandlerAdapter的不同 397
13.5.3 返回值處理的不同 398
13.5.4 工作流程小結 399
13.6 小結 399
第4部分 運行Spring Boot套用
第 14章 運行Spring Boot套用 403
14.1 部署打包的兩種方式 403
14.1.1 以可獨立運行jar包的方式 403
14.1.2 以war包的方式 404
14.2 基於jar包的獨立運行機制 405
14.2.1 可運行jar包的前置知識 405
14.2.2 Spring Boot的可運行jar包結構 405
14.2.3 JarLauncher的設計及工作原理 407
14.3 基於war包的外部Web容器運行機制 412
14.3.1 Servlet 3.0規範中引導套用啟動的說明 413
14.3.2 Spring BootServletInitializer的作用和原理 413
14.4 Spring Boot 2.3新特性:優雅停機 415
14.4.1 測試優雅停機場景 416
14.4.2 優雅停機的實現原理 417
14.5 小結 419