《Spring源碼深度解析(第2版)》從核心實(shí)現(xiàn)、企業(yè)應(yīng)用和Spring Boot這3個(gè)方面,由淺入深、由易到難地對(duì)Spring源碼展開了系統(tǒng)的講解,包括Spring 整體架構(gòu)和環(huán)境搭建、容器的基本實(shí)現(xiàn)、默認(rèn)標(biāo)簽的解析、自定義標(biāo)簽的解析、bean的加載、容器的功能擴(kuò)展、AOP、數(shù)據(jù)庫連接JDBC、整合MyBatis、事務(wù)、SpringMVC、遠(yuǎn)程服務(wù)、Spring消息、Spring Boot體系原理等內(nèi)容。
《Spring源碼深度解析(第2版)》不僅介紹了使用Spring框架開發(fā)項(xiàng)目必須掌握的核心概念,還指導(dǎo)讀者使用Spring框架編寫企業(yè)級(jí)應(yīng)用,并針對(duì)在編寫代碼的過程中如何優(yōu)化代碼、如何使得代碼高效給出了切實(shí)可行的建議,從而幫助讀者全面提升實(shí)戰(zhàn)能力。
《Spring源碼深度解析(第2版)》語言簡(jiǎn)潔,示例豐富,可幫助讀者迅速掌握使用Spring進(jìn)行開發(fā)所需的各種技能。本書適合于已具有一定Java編程基礎(chǔ)的讀者,以及在Java平臺(tái)下進(jìn)行各類軟件開發(fā)的開發(fā)人員、測(cè)試人員等。
全面剖析Spring源碼,方便讀者根據(jù)業(yè)務(wù)需求進(jìn)行更改或擴(kuò)展
所有知識(shí)點(diǎn)秉承由淺入深、由易到難的講解架構(gòu)
采用抽絲剝繭的方式來闡述復(fù)雜的邏輯,降低理解難度
Spring是一個(gè)源碼開放的輕量級(jí)Java開發(fā)框架,旨在解決業(yè)務(wù)邏輯層和其他各層的松耦合問題。自從2003年推出以來,逐漸發(fā)展成為事實(shí)上的Java EE開發(fā)標(biāo)準(zhǔn)。多年來,Spring不但得到了廣泛的應(yīng)用,還直接或間接地影響了眾多JSR規(guī)范的制定。Spring不僅在傳統(tǒng)的Java EE開發(fā)中舉足輕重,還拓展到移動(dòng)開發(fā)、大數(shù)據(jù)、應(yīng)用集成等領(lǐng)域,成為VMware云戰(zhàn)略的一部分。
Spring框架根本的使命是簡(jiǎn)化Java開發(fā),因此學(xué)習(xí)、研究、掌握Spring框架成為Java開發(fā)人員的必修課程。而閱讀Spring源碼無疑可以更快、更好地理解Spring的運(yùn)行機(jī)制。本書從核心實(shí)現(xiàn)、企業(yè)應(yīng)用以及Spring Boot這三方面入手,對(duì)Spring源碼進(jìn)行了由淺入深、由易到難的系統(tǒng)講解。本書不但介紹了使用Spring開發(fā)項(xiàng)目時(shí)必須掌握的核心概念,還講解了使用Spring開發(fā)企業(yè)級(jí)應(yīng)用的方式,并給出了代碼優(yōu)化的相關(guān)建議。
本書內(nèi)容:
核心實(shí)現(xiàn)
Spring整體架構(gòu)和環(huán)境
容器的基本實(shí)現(xiàn)
默認(rèn)標(biāo)簽的解析
自定義標(biāo)簽的解析
bean的加載
容器的功能擴(kuò)展
AOP
企業(yè)應(yīng)用
數(shù)據(jù)庫連接JDBC
整合MyBatis
事務(wù)
SpringMVC
遠(yuǎn)程服務(wù)
Spring消息
Spring Boot
Spring Boot體系原理
郝佳,計(jì)算機(jī)專業(yè)碩士學(xué)位,曾發(fā)表過多篇論文并先后被EI、SCI收錄;2008 年遼寧省教育廳科技計(jì)劃項(xiàng)目研究人之一;長(zhǎng)期奮斗于J2EE領(lǐng)域,2013年入職阿里巴巴,目前擔(dān)任業(yè)務(wù)中間件軟件架構(gòu)師;一直專注于中間件領(lǐng)域,擁有6項(xiàng)技術(shù)專利,擅長(zhǎng)系統(tǒng)的性能優(yōu)化;熱衷于研究各種開源代碼并從中進(jìn)行總結(jié),從而實(shí)現(xiàn)個(gè)人技能的提高,尤其對(duì)Spring、Hibernate、MyBatis、JMS、Tomcat等源碼有著深刻的理解和認(rèn)識(shí)。
第 1部分 核心實(shí)現(xiàn)
第 1章 Spring整體架構(gòu)和環(huán)境搭建 2
1.1 Spring的整體架構(gòu) 2
1.2 環(huán)境搭建 4
1.2.1 源碼鏈接獲取 5
1.2.2 源碼下載及IDEA導(dǎo)入 6
1.3 cglib和objenesis的編譯錯(cuò)誤解決 9
1.3.1 問題發(fā)現(xiàn)及原因 9
1.3.2 問題解決 9
1.4 AspectJ編譯問題解決 10
1.4.1 問題發(fā)現(xiàn) 10
1.4.2 問題原因 12
1.4.3 問題解決 13
第 2章 容器的基本實(shí)現(xiàn) 19
2.1 容器基本用法 19
2.2 功能分析 20
2.3 工程搭建 21
2.4 Spring的結(jié)構(gòu)組成 22
2.4.1 beans包的層級(jí)結(jié)構(gòu) 22
2.4.2 核心類介紹 23
2.5 容器的基礎(chǔ)XmlBeanFactory 26
2.5.1 配置文件封裝 27
2.5.2 加載Bean 30
2.6 獲取XML的驗(yàn)證模式 33
2.6.1 DTD與XSD區(qū)別 33
2.6.2 驗(yàn)證模式的讀取 35
2.7 獲取Document 37
2.8 解析及注冊(cè)BeanDefinitions 40
2.8.1 profile屬性的使用 42
2.8.2 解析并注冊(cè)BeanDefinition 42
第3章 默認(rèn)標(biāo)簽的解析 44
3.1 bean標(biāo)簽的解析及注冊(cè) 44
3.1.1 解析BeanDefinition 46
3.1.2 AbstractBeanDefinition屬性 64
3.1.3 解析默認(rèn)標(biāo)簽中的自定義標(biāo)簽元素 67
3.1.4 注冊(cè)解析的BeanDefinition 69
3.1.5 通知監(jiān)聽器解析及注冊(cè)完成 72
3.2 alias標(biāo)簽的解析 72
3.3 import標(biāo)簽的解析 73
3.4 嵌入式beans標(biāo)簽的解析 76
第4章 自定義標(biāo)簽的解析 77
4.1 自定義標(biāo)簽使用 78
4.2 自定義標(biāo)簽解析 80
4.2.1 獲取標(biāo)簽的命名空間 81
4.2.2 提取自定義標(biāo)簽處理器 81
4.2.3 標(biāo)簽解析 83
第5章 bean的加載 86
5.1 FactoryBean的使用 92
5.2 緩存中獲取單例bean 93
5.3 從bean的實(shí)例中獲取對(duì)象 94
5.4 獲取單例 98
5.5 準(zhǔn)備創(chuàng)建bean 100
5.5.1 處理override屬性 101
5.5.2 實(shí)例化的前置處理 102
5.6 循環(huán)依賴 104
5.6.1 什么是循環(huán)依賴 104
5.6.2 Spring如何解決循環(huán)依賴 104
5.7 創(chuàng)建bean 108
5.7.1 創(chuàng)建bean的實(shí)例 111
5.7.2 記錄創(chuàng)建bean的ObjectFactory 120
5.7.3 屬性注入 123
5.7.4 初始化bean 132
5.7.5 注冊(cè)DisposableBean 136
第6章 容器的功能擴(kuò)展 137
6.1 設(shè)置配置路徑 138
6.2 擴(kuò)展功能 138
6.3 環(huán)境準(zhǔn)備 140
6.4 加載BeanFactory 141
6.4.1 定制BeanFactory 143
6.4.2 加載BeanDefinition 144
6.5 功能擴(kuò)展 145
6.5.1 增加SpEL語言的支持 146
6.5.2 增加屬性注冊(cè)編輯器 147
6.5.3 添加ApplicationContextAwareProcessor處理器 152
6.5.4 設(shè)置忽略依賴 154
6.5.5 注冊(cè)依賴 154
6.6 BeanFactory的后處理 154
6.6.1 激活注冊(cè)的BeanFactoryPostProcessor 154
6.6.2 注冊(cè)BeanPostProcessor 160
6.6.3 初始化消息資源 163
6.6.4 初始化ApplicationEventMulticaster 167
6.6.5 注冊(cè)監(jiān)聽器 169
6.7 初始化非延遲加載單例 169
6.8 finishRefresh 172
第7章 AOP 175
7.1 動(dòng)態(tài)AOP使用示例 175
7.2 動(dòng)態(tài)AOP自定義標(biāo)簽 177
7.3 創(chuàng)建AOP代理 181
7.3.1 獲取增強(qiáng)器 184
7.3.2 尋找匹配的增強(qiáng)器 193
7.3.3 創(chuàng)建代理 195
7.4 靜態(tài)AOP使用示例 209
7.5 創(chuàng)建AOP靜態(tài)代理 211
7.5.1 Instrumentation使用 211
7.5.2 自定義標(biāo)簽 215
7.5.3 織入 217
第 2部分 企業(yè)應(yīng)用
第8章 數(shù)據(jù)庫連接JDBC 222
8.1 Spring連接數(shù)據(jù)庫程序?qū)崿F(xiàn)(JDBC) 223
8.2 save/update功能的實(shí)現(xiàn) 225
8.2.1 基礎(chǔ)方法execute 227
8.2.2 Update中的回調(diào)函數(shù) 231
8.3 query功能的實(shí)現(xiàn) 233
8.4 queryForObject 237
第9章 整合MyBatis 239
9.1 MyBatis獨(dú)立使用 239
9.2 Spring整合MyBatis 243
9.3 源碼分析 245
9.3.1 sqlSessionFactory創(chuàng)建 245
9.3.2 MapperFactoryBean的創(chuàng)建 249
9.3.3 MapperScannerConfigurer 252
第 10章 事務(wù) 262
10.1 JDBC方式下的事務(wù)使用示例 262
10.2 事務(wù)自定義標(biāo)簽 265
10.2.1 注冊(cè)InfrastructureAdvisorAutoProxyCreator 265
10.2.2 獲取對(duì)應(yīng)class/method的增強(qiáng)器 269
10.3 事務(wù)增強(qiáng)器 276
10.3.1 創(chuàng)建事務(wù) 279
10.3.2 回滾處理 289
10.3.3 事務(wù)提交 295
第 11章 SpringMVC 298
11.1 SpringMVC快速體驗(yàn) 298
11.2 ContextLoaderListener 302
11.2.1 ServletContextListener的使用 302
11.2.2 Spring中的ContextLoaderListener 303
11.3 DispatcherServlet 306
11.3.1 servlet的使用 307
11.3.2 DispatcherServlet的初始化 308
11.3.3 WebApplicationContext的初始化 311
11.4 DispatcherServlet的邏輯處理 327
11.4.1 MultipartContent類型的request處理 333
11.4.2 根據(jù)request信息尋找對(duì)應(yīng)的Handler 333
11.4.3 沒找到對(duì)應(yīng)的Handler的錯(cuò)誤處理 337
11.4.4 根據(jù)當(dāng)前Handler尋找對(duì)應(yīng)的HandlerAdapter 338
11.4.5 緩存處理 338
11.4.6 HandlerInterceptor的處理 339
11.4.7 邏輯處理 340
11.4.8 異常視圖的處理 341
11.4.9 根據(jù)視圖跳轉(zhuǎn)頁面 341
第 12章 遠(yuǎn)程服務(wù) 347
12.1 RMI 347
12.1.1 使用示例 347
12.1.2 服務(wù)端實(shí)現(xiàn) 349
12.1.3 客戶端實(shí)現(xiàn) 357
12.2 HttpInvoker 362
12.2.1 使用示例 362
12.2.2 服務(wù)端實(shí)現(xiàn) 364
12.2.3 客戶端實(shí)現(xiàn) 368
第 13章 Spring消息 374
13.1 JMS的獨(dú)立使用 374
13.2 Spring整合ActiveMQ 376
13.3 源碼分析 378
13.3.1 JmsTemplate 379
13.3.2 監(jiān)聽器容器 383
第3部分 Spring Boot
第 14章 Spring Boot體系原理 394
14.1 Spring Boot源碼安裝 396
14.2 第 一個(gè)Starter 397
14.3 探索SpringApplication啟動(dòng)Spring 400
14.3.1 SpringContext創(chuàng)建 401
14.3.2 bean的加載 402
14.3.3 Spring擴(kuò)展屬性的加載 403
14.3.4 總結(jié) 403
14.4 Starter自動(dòng)化配置原理 403
14.4.1 spring.factories的加載 404
14.4.2 factories調(diào)用時(shí)序圖 405
14.4.3 配置類的解析 407
14.4.4 Componentscan的切入點(diǎn) 410
14.5 Conditional機(jī)制實(shí)現(xiàn) 413
14.5.1 Conditional使用 413
14.5.2 Conditional原理 415
14.5.3 調(diào)用切入點(diǎn) 418
14.6 屬性自動(dòng)化配置實(shí)現(xiàn) 420
14.6.1 示例 420
14.6.2 原理 422
14.7 Tomcat啟動(dòng) 428