Spring Boot是目前Java EE開發(fā)中頗受歡迎的框架之一。依托于底層Spring Framework的基礎(chǔ)支撐,以及完善強(qiáng)大的特性設(shè)計(jì),Spring Boot已成為業(yè)界流行的應(yīng)用和微服務(wù)開發(fā)基礎(chǔ)框架。
《Spring Boot源碼解讀與原理分析》共14章,分為4個(gè)部分。第一部分介紹Spring Boot底層依賴的核心容器,以及底層Spring Framework的兩大核心特性IOC和AOP;第二部分從底層源碼角度深入剖析Spring Boot的生命周期,包括Spring Application、IOC容器、嵌入式Web容器和AOP模塊的生命周期;第三部分針對(duì)項(xiàng)目開發(fā)中整合的主流場(chǎng)景,介紹場(chǎng)景模塊中的核心裝配和關(guān)鍵機(jī)制原理,如JDBC中的事務(wù)、Web中的核心控制器等;第四部分與Spring Boot的運(yùn)行部署相關(guān),針對(duì)不同運(yùn)行場(chǎng)景講解Spring Boot的啟動(dòng)引導(dǎo)方式。
閱讀《Spring Boot源碼解讀與原理分析》之前,讀者需要先對(duì)Spring Framework和Spring Boot有基本的理解與簡(jiǎn)單的框架使用經(jīng)驗(yàn)或項(xiàng)目開發(fā)經(jīng)驗(yàn)。本書的重點(diǎn)是Spring Boot的設(shè)計(jì)、思想和原理,無論是對(duì)于已經(jīng)有一定基礎(chǔ)的開發(fā)者還是已熟練使用Spring Boot并希望進(jìn)一步提升技能和水平的開發(fā)者,本書是他們透徹研究Spring Boot源碼和原理的理想選擇。
1.Java底層技術(shù)研究開發(fā)工程師LinkedBear傾情分享多年來研究Spring技術(shù)體系的框架體系實(shí)踐經(jīng)驗(yàn)與架構(gòu)封裝經(jīng)驗(yàn),具有強(qiáng)大的可參考價(jià)值與實(shí)踐意義
2.Spring學(xué)習(xí)難度大、門檻高,本書為開發(fā)者朋友提供了一段相對(duì)合理、平滑、系統(tǒng)的源碼閱讀和學(xué)習(xí)軌跡,更容易理解上手
3.本書適合擁有一定Spring理解與使用經(jīng)驗(yàn)的讀者學(xué)習(xí)進(jìn)階
4.本書適用的Spring Boot源碼解讀基準(zhǔn)版本為 2.3.11.RELEASE 與 2.5.3,在未特別說明時(shí),本書引用的源碼均基于Spring Boot 2.3.11.RELEASE
5.附贈(zèng)本書附帶的測(cè)試代碼與課件
LinkedBear,Java開發(fā)工程師、底層技術(shù)研究者與分享者,傾心研究Spring技術(shù)體系多年,對(duì)Spring、Spring Boot等框架有獨(dú)到的見解,擁有豐富的框架體系實(shí)踐經(jīng)驗(yàn)和架構(gòu)封裝經(jīng)驗(yàn)。
第 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ā)第 一個(gè)Spring Boot應(yīng)用 6
1.5.1 創(chuàng)建項(xiàng)目 6
1.5.2 編寫簡(jiǎn)單代碼 10
1.6 小結(jié) 11
第 2章 Spring Boot的自動(dòng)裝配 12
2.1 組件裝配 12
2.1.1 組件 12
2.1.2 手動(dòng)裝配 13
2.1.3 自動(dòng)裝配 13
2.2 Spring Framework的模塊裝配 14
2.2.1 模塊 14
2.2.2 快速體會(huì)模塊裝配 15
2.2.3 導(dǎo)入配置類 17
2.2.4 導(dǎo)入ImportSelector 19
2.2.5 導(dǎo)入ImportBeanDefinitionRegistrar 21
2.2.6 擴(kuò)展:DeferredImportSelector 22
2.3 Spring Framework的條件裝配 24
2.3.1 基于Profile的裝配 24
2.3.2 基于Conditional的裝配 26
2.4 SPI機(jī)制 28
2.4.1 JDK原生的SPI 29
2.4.2 Spring Framework 3.2的SPI 30
2.5 Spring Boot的裝配機(jī)制 32
2.5.1 @ComponentScan 33
2.5.2 @SpringBootConfiguration 34
2.5.3 @EnableAutoConfiguration 35
2.6 WebMvc場(chǎng)景下的自動(dòng)裝配原理 42
2.6.1 Servlet容器的裝配 43
2.6.2 DispatcherServlet的裝配 46
2.6.3 SpringWebMvc的裝配 48
2.7 小結(jié) 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對(duì)IOC容器的擴(kuò)展 75
3.2.1 WebServerApplicationContext 75
3.2.2 AnnotationConfigServletWebServerApplicationContext 75
3.2.3 ReactiveWebApplicationContext 76
3.3 選用注解驅(qū)動(dòng)IOC容器的原因 76
3.3.1 配置方式的對(duì)比 76
3.3.2 約定大于配置下的選擇 77
3.4 Environment 77
3.4.1 Environment概述 77
3.4.2 Environment的結(jié)構(gòu)與設(shè)計(jì) 78
3.4.3 Environment與IOC容器的關(guān)系 80
3.5 BeanDefinition 81
3.5.1 理解元信息 81
3.5.2 BeanDefinition概述 81
3.5.3 BeanDefinition的結(jié)構(gòu)與設(shè)計(jì) 82
3.5.4 體會(huì)BeanDefinition 85
3.5.5 BeanDefinitionRegistry 88
3.5.6 設(shè)計(jì)BeanDefinition的意義 89
3.6 后置處理器 89
3.6.1 理解后置處理器 89
3.6.2 BeanPostProcessor 90
3.6.3 BeanPostProcessor的擴(kuò)展 91
3.6.4 BeanFactoryPostProcessor 93
3.6.5 BeanDefinitionRegistryPostProcessor 94
3.6.6 后置處理器對(duì)比 95
3.7 IOC容器的啟動(dòng)流程 95
3.8 小結(jié) 100
第4章 Spring Boot的核心引導(dǎo):SpringApplication 101
4.1 總體設(shè)計(jì) 101
4.1.1 啟動(dòng)失敗的錯(cuò)誤報(bào)告 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 應(yīng)用退出 106
4.2 生命周期概述 107
4.2.1 創(chuàng)建SpringApplication 107
4.2.2 啟動(dòng)SpringApplication 107
4.2.3 應(yīng)用退出 108
4.3 小結(jié) 108
第5章 Spring Boot的AOP支持 109
5.1 Spring Framework的AOP回顧 109
5.1.1 AOP術(shù)語 109
5.1.2 通知類型 110
5.2 Spring Boot使用AOP 110
5.3 AOP的開關(guān):@EnableAspectJAutoProxy 111
5.3.1 AspectJAutoProxyRegistrar 112
5.3.2 AnnotationAwareAspectJAutoProxyCreator 114
5.4 小結(jié) 117
第 2部分 Spring Boot的生命周期原理分析
第6章 Spring Boot準(zhǔn)備容器與環(huán)境 121
6.1 創(chuàng)建SpringApplication 122
6.1.1 推斷Web環(huán)境 122
6.1.2 設(shè)置初始化器 123
6.1.3 設(shè)置監(jiān)聽器 125
6.1.4 確定主啟動(dòng)類 126
6.1.5 與Spring Boot 1.x的區(qū)別 127
6.1.6 與Spring Boot 2.4.x的區(qū)別 128
6.2 啟動(dòng)SpringApplication 129
6.2.1 前置準(zhǔn)備 130
6.2.2 獲取SpringApplicationRunListeners 133
6.2.3 準(zhǔn)備運(yùn)行時(shí)環(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 小結(jié) 149
第7章 IOC容器的刷新 150
7.1 初始化前的預(yù)處理 152
7.1.1 初始化屬性配置 152
7.1.2 初始化早期事件的集合 154
7.2 obtainFreshBeanFactory:初始化BeanFactory 154
7.2.1 注解驅(qū)動(dòng)的refreshBeanFactory 155
7.2.2 XML驅(qū)動(dòng)的refreshBeanFactory 155
7.3 prepareBeanFactory:BeanFactory的預(yù)處理動(dòng)作 156
7.3.1 ApplicationContextAwareProcessor 157
7.3.2 自動(dòng)注入的支持 158
7.3.3 ApplicationListenerDetector 159
7.4 postProcessBeanFactory:BeanFactory的后置處理 160
7.4.1 回調(diào)父類方法 161
7.4.2 組件掃描&解析手動(dòng)傳入的配置類 164
7.5 invokeBeanFactoryPostProcessors:執(zhí)行BeanFactoryPostProcessor 164
7.5.1 現(xiàn)有的后置處理器分類 165
7.5.2 執(zhí)行最高優(yōu)先級(jí)的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被重復(fù)注冊(cè) 187
7.6.3 PriorityOrdered類型的后置處理器 188
7.7 initMessageSource:初始化國(guó)際化組件 188
7.8 initApplicationEventMulticaster:初始化事件廣播器 190
7.9 onRefresh:子類擴(kuò)展的刷新動(dòng)作 191
7.10 registerListeners:注冊(cè)監(jiān)聽器 191
7.11 finishBeanFactoryInitialization:初始化剩余的單例bean對(duì)象 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-刷新后的動(dòng)作 216
7.12.1 LifecycleProcessor 216
7.12.2 getLifecycleProcessor().onRefresh() 217
7.13 resetCommonCaches:清除緩存 217
7.14 ApplicationContext初始化中的擴(kuò)展點(diǎn) 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 基于構(gòu)造方法的循環(huán)依賴 230
7.15.5 基于原型Bean的循環(huán)依賴 230
7.15.6 引入AOP的額外設(shè)計(jì) 231
7.16 小結(jié) 232
第8章 Spring Boot容器刷新擴(kuò)展:嵌入式Web容器 233
8.1 嵌入式Tomcat簡(jiǎn)介 233
8.1.1 嵌入式Tomcat與普通Tomcat 234
8.1.2 Tomcat整體架構(gòu) 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容器的初始化時(shí)機(jī) 237
8.3.1 創(chuàng)建WebServer 238
8.3.2 Web容器關(guān)閉相關(guān)的回調(diào) 241
8.4 嵌入式Tomcat的初始化 242
8.4.1 獲取Context 243
8.4.2 阻止Connector初始化 244
8.4.3 啟動(dòng)Tomcat 244
8.4.4 阻止Tomcat結(jié)束 246
8.5 嵌入式Tomcat的啟動(dòng) 248
8.6 小結(jié) 249
第9章 AOP模塊的生命周期 250
9.1 @EnableAspectJAutoProxy 250
9.2 AnnotationAwareAspectJAutoProxyCreator 252
9.2.1 類繼承結(jié)構(gòu) 253
9.2.2 初始化時(shí)機(jī) 253
9.2.3 作用時(shí)機(jī) 254
9.3 Advisor與切面類的收集 257
9.3.1 收集增強(qiáng)器的邏輯 257
9.3.2 收集原生增強(qiáng)器 258
9.3.3 解析AspectJ切面封裝增強(qiáng)器 259
9.4 TargetSource的設(shè)計(jì) 266
9.4.1 TargetSource的設(shè)計(jì) 267
9.4.2 TargetSource的好處 267
9.4.3 TargetSource的結(jié)構(gòu) 267
9.4.4 Spring Framework中提供的TargetSource 268
9.5 代理對(duì)象生成的核心:wrapIfNecessary 268
9.5.1 getAdvicesAndAdvisorsForBean 269
9.5.2 createProxy 274
9.6 代理對(duì)象的底層執(zhí)行邏輯 277
9.6.1 DemoService#save 277
9.6.2 獲取增強(qiáng)器鏈 278
9.6.3 執(zhí)行增強(qiáng)器 281
9.6.4 jdk動(dòng)態(tài)代理的執(zhí)行底層 285
9.6.5 AspectJ中通知的底層實(shí)現(xiàn) 287
9.7 AOP通知的執(zhí)行順序?qū)Ρ?289
9.7.1 測(cè)試代碼編寫 289
9.7.2 Spring Framework 5.x的順序 290
9.7.3 Spring Framework 4.x的順序 291
9.8 小結(jié) 292
第3部分 Spring Boot整合常用開發(fā)場(chǎng)景
第 10章 Spring Boot整合JDBC 295
10.1 Spring Boot整合JDBC項(xiàng)目搭建 295
10.1.1 初始化數(shù)據(jù)庫(kù) 295
10.1.2 整合項(xiàng)目 296
10.1.3 編寫測(cè)試代碼 296
10.2 整合JDBC后的自動(dòng)裝配 297
10.2.1 配置數(shù)據(jù)源 298
10.2.2 創(chuàng)建JdbcTemplate 302
10.2.3 配置事務(wù)管理器 303
10.3 聲明式事務(wù)的生效原理 303
10.3.1 TransactionAutoConfiguration 303
10.3.2 TransactionManagementConfigurationSelector 305
10.3.3 AutoProxyRegistrar 305
10.3.4 ProxyTransactionManagementConfiguration 307
10.4 聲明式事務(wù)的控制全流程 309
10.4.1 CglibAopProxy#intercept 309
10.4.2 TransactionInterceptor 310
10.5 聲明式事務(wù)的傳播行為控制 319
10.5.1 修改測(cè)試代碼 320
10.5.2 PROPAGATION_REQUIRED 321
10.5.3 PROPAGATION_REQUIRES_NEW 327
10.6 小結(jié) 330
第 11章 Spring Boot整合MyBatis 332
11.1 MyBatis框架概述 332
11.2 Spring Boot整合MyBatis項(xiàng)目搭建 333
11.3 自動(dòng)裝配核心 334
11.3.1 場(chǎng)景啟動(dòng)器的秘密 334
11.3.2 MybatisLanguageDriverAutoConfiguration 335
11.3.3 MybatisAutoConfiguration 335
11.4 小結(jié) 342
第 12章 Spring Boot整合WebMvc 343
12.1 整合WebMvc的核心自動(dòng)裝配 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工作全流程小結(jié) 372
12.5 小結(jié) 372
第 13章 Spring Boot整合WebFlux 374
13.1 快速了解響應(yīng)式編程與Reactor 374
13.1.1 命令式與響應(yīng)式 374
13.1.2 概念和思想的回顧與引入 375
13.1.3 快速體會(huì)Reactor框架 377
13.2 快速使用WebFlux 380
13.2.1 WebMvc的開發(fā)風(fēng)格 380
13.2.2 逐步過渡到WebFlux 381
13.2.3 WebFlux的函數(shù)式開發(fā) 382
13.2.4 WebMvc與WebFlux的對(duì)比 383
13.3 WebFlux的自動(dòng)裝配 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 工作流程小結(jié) 395
13.5 DispatcherHandler的函數(shù)式端點(diǎn)工作原理 396
13.5.1 HandlerMapping的不同 396
13.5.2 HandlerAdapter的不同 397
13.5.3 返回值處理的不同 398
13.5.4 工作流程小結(jié) 399
13.6 小結(jié) 399
第4部分 運(yùn)行Spring Boot應(yīng)用
第 14章 運(yùn)行Spring Boot應(yīng)用 403
14.1 部署打包的兩種方式 403
14.1.1 以可獨(dú)立運(yùn)行jar包的方式 403
14.1.2 以war包的方式 404
14.2 基于jar包的獨(dú)立運(yùn)行機(jī)制 405
14.2.1 可運(yùn)行jar包的前置知識(shí) 405
14.2.2 Spring Boot的可運(yùn)行jar包結(jié)構(gòu) 405
14.2.3 JarLauncher的設(shè)計(jì)及工作原理 407
14.3 基于war包的外部Web容器運(yùn)行機(jī)制 412
14.3.1 Servlet 3.0規(guī)范中引導(dǎo)應(yīng)用啟動(dòng)的說明 413
14.3.2 Spring BootServletInitializer的作用和原理 413
14.4 Spring Boot 2.3新特性:優(yōu)雅停機(jī) 415
14.4.1 測(cè)試優(yōu)雅停機(jī)場(chǎng)景 416
14.4.2 優(yōu)雅停機(jī)的實(shí)現(xiàn)原理 417
14.5 小結(jié) 419