Spring Boot是目前Java EE開發(fā)中頗受歡迎的框架之一。依托于底層Spring Framework的基礎支撐,以及完善強大的特性設計,Spring Boot已成為業(yè)界流行的應用和微服務開發(fā)基礎框架。
《Spring Boot源碼解讀與原理分析》共14章,分為4個部分。第一部分介紹Spring Boot底層依賴的核心容器,以及底層Spring Framework的兩大核心特性IOC和AOP;第二部分從底層源碼角度深入剖析Spring Boot的生命周期,包括Spring Application、IOC容器、嵌入式Web容器和AOP模塊的生命周期;第三部分針對項目開發(fā)中整合的主流場景,介紹場景模塊中的核心裝配和關鍵機制原理,如JDBC中的事務、Web中的核心控制器等;第四部分與Spring Boot的運行部署相關,針對不同運行場景講解Spring Boot的啟動引導方式。
閱讀《Spring Boot源碼解讀與原理分析》之前,讀者需要先對Spring Framework和Spring Boot有基本的理解與簡單的框架使用經(jīng)驗或項目開發(fā)經(jīng)驗。本書的重點是Spring Boot的設計、思想和原理,無論是對于已經(jīng)有一定基礎的開發(fā)者還是已熟練使用Spring Boot并希望進一步提升技能和水平的開發(fā)者,本書是他們透徹研究Spring Boot源碼和原理的理想選擇。
1.Java底層技術研究開發(fā)工程師LinkedBear傾情分享多年來研究Spring技術體系的框架體系實踐經(jīng)驗與架構封裝經(jīng)驗,具有強大的可參考價值與實踐意義
2.Spring學習難度大、門檻高,本書為開發(fā)者朋友提供了一段相對合理、平滑、系統(tǒng)的源碼閱讀和學習軌跡,更容易理解上手
3.本書適合擁有一定Spring理解與使用經(jīng)驗的讀者學習進階
4.本書適用的Spring Boot源碼解讀基準版本為 2.3.11.RELEASE 與 2.5.3,在未特別說明時,本書引用的源碼均基于Spring Boot 2.3.11.RELEASE
5.附贈本書附帶的測試代碼與課件
LinkedBear,Java開發(fā)工程師、底層技術研究者與分享者,傾心研究Spring技術體系多年,對Spring、Spring Boot等框架有獨到的見解,擁有豐富的框架體系實踐經(jīng)驗和架構封裝經(jīng)驗。
第 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 開發(fā)第 一個Spring Boot應用 6
1.5.1 創(chuàng)建項目 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 選用注解驅(qū)動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 監(jiān)聽與回調(diào) 104
4.1.6 應用退出 106
4.2 生命周期概述 107
4.2.1 創(chuàng)建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準備容器與環(huán)境 121
6.1 創(chuàng)建SpringApplication 122
6.1.1 推斷Web環(huán)境 122
6.1.2 設置初始化器 123
6.1.3 設置監(jiān)聽器 125
6.1.4 確定主啟動類 126
6.1.5 與Spring Boot 1.x的區(qū)別 127
6.1.6 與Spring Boot 2.4.x的區(qū)別 128
6.2 啟動SpringApplication 129
6.2.1 前置準備 130
6.2.2 獲取SpringApplicationRunListeners 133
6.2.3 準備運行時環(huán)境 135
6.3 IOC容器的創(chuàng)建與初始化 137
6.3.1 打印Banner 137
6.3.2 創(chuàng)建IOC容器 140
6.3.3 初始化IOC容器 142
6.3.4 刷新IOC容器 145
6.3.5 Spring Boot 2.4.x的新特性 145
6.4 IOC容器刷新后的回調(diào) 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 注解驅(qū)動的refreshBeanFactory 155
7.2.2 XML驅(qū)動的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 回調(diào)父類方法 161
7.4.2 組件掃描&解析手動傳入的配置類 164
7.5 invokeBeanFactoryPostProcessors:執(zhí)行BeanFactoryPostProcessor 164
7.5.1 現(xiàn)有的后置處理器分類 165
7.5.2 執(zhí)行最高優(yōu)先級的BeanDefinitionRegistryPostProcessor 165
7.5.3 執(zhí)行其他BeanDefinitionRegistryPostProcessor 166
7.5.4 回調(diào)postProcessBeanFactory方法 167
7.5.5 BeanFactoryPostProcessor的分類 168
7.5.6 執(zhí)行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:注冊監(jiān)聽器 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 循環(huán)依賴的解決方案 221
7.15.1 循環(huán)依賴的產(chǎn)生 221
7.15.2 循環(huán)依賴的解決模型 222
7.15.3 基于setter/@Autowired的循環(huán)依賴 222
7.15.4 基于構造方法的循環(huán)依賴 230
7.15.5 基于原型Bean的循環(huán)依賴 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 創(chuàng)建WebServer 238
8.3.2 Web容器關閉相關的回調(diào) 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 代理對象的底層執(zhí)行邏輯 277
9.6.1 DemoService#save 277
9.6.2 獲取增強器鏈 278
9.6.3 執(zhí)行增強器 281
9.6.4 jdk動態(tài)代理的執(zhí)行底層 285
9.6.5 AspectJ中通知的底層實現(xiàn) 287
9.7 AOP通知的執(zhí)行順序?qū)Ρ?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整合常用開發(fā)場景
第 10章 Spring Boot整合JDBC 295
10.1 Spring Boot整合JDBC項目搭建 295
10.1.1 初始化數(shù)據(jù)庫 295
10.1.2 整合項目 296
10.1.3 編寫測試代碼 296
10.2 整合JDBC后的自動裝配 297
10.2.1 配置數(shù)據(jù)源 298
10.2.2 創(chuàng)建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的開發(fā)風格 380
13.2.2 逐步過渡到WebFlux 381
13.2.3 WebFlux的函數(shù)式開發(fā) 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的傳統(tǒng)方式工作原理 390
13.4.1 handle方法概覽 390
13.4.2 篩選HandlerMapping 391
13.4.3 搜尋HandlerAdapter并執(zhí)行 393
13.4.4 返回值處理 394
13.4.5 工作流程小結 395
13.5 DispatcherHandler的函數(shù)式端點工作原理 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規(guī)范中引導應用啟動的說明 413
14.3.2 Spring BootServletInitializer的作用和原理 413
14.4 Spring Boot 2.3新特性:優(yōu)雅停機 415
14.4.1 測試優(yōu)雅停機場景 416
14.4.2 優(yōu)雅停機的實現(xiàn)原理 417
14.5 小結 419