基于編程開發(fā)實踐,不僅深度解析Spring 5的原理與新特性,更從環(huán)境準備、頂層結(jié)構(gòu)設(shè)計、數(shù)據(jù)訪問等方面一步步地推導(dǎo)出Spring的設(shè)計原理。在每個知識點上,均以大量的經(jīng)典代碼案例輔助講解,使理論緊密聯(lián)系實際。最后手寫30個類,以體會Spring作者的創(chuàng)作過程,讓每一位讀者學(xué)以致用。
Spring5核心原理與30個類手寫實戰(zhàn)資料目錄
第1篇 Spring內(nèi)功心法
第1章 軟件架構(gòu)設(shè)計原則 2
1.1 開閉原則 2
1.2 依賴倒置原則 4
1.3 單一職責(zé)原則 7
1.4 接口隔離原則 10
1.5 迪米特原則 12
1.6 里氏替換原則 14
1.7 合成復(fù)用原則 19
1.8 設(shè)計原則總結(jié) 20
第2章 Spring中常用的設(shè)計模式 21
2.1 為什么要從設(shè)計模式開始 21
2.1.1 寫出優(yōu)雅的代碼 22
2.1.2 更好地重構(gòu)項目 24
2.1.3 經(jīng)典框架都在用設(shè)計模式解決問題 36
2.2 工廠模式詳解 36
2.2.1 工廠模式的由來 36
2.2.2 簡單工廠模式 37
2.2.3 工廠方法模式 41
2.2.4 抽象工廠模式 43
2.2.5 利用工廠模式重構(gòu)的實踐案例 47
2.3 單例模式詳解 53
2.3.1 單例模式的應(yīng)用場景 53
2.3.2 餓漢式單例模式 53
2.3.3 懶漢式單例模式 54
2.3.4 反射破壞單例 60
2.3.5 序列化破壞單例 61
2.3.6 注冊式單例模式 68
2.3.7 線程單例實現(xiàn)ThreadLocal 74
2.3.8 單例模式小結(jié) 75
2.4 原型模式詳解 75
2.4.1 原型模式的應(yīng)用場景 75
2.4.2 淺克隆 77
2.4.3 深克隆 79
2.4.4 克隆破壞單例模式 81
2.4.5 clone()方法的源碼 82
2.5 代理模式詳解 82
2.5.1 代理模式的應(yīng)用場景 82
2.5.2 靜態(tài)代理 83
2.5.3 動態(tài)代理 88
2.5.4 代理模式與Spring 107
2.5.5 靜態(tài)代理和動態(tài)代理的本質(zhì)區(qū)別 108
2.5.6 代理模式的優(yōu)缺點 109
2.6 委派模式詳解 109
2.6.1 委派模式的定義及應(yīng)用場景 109
2.6.2 委派模式在源碼中的體現(xiàn) 111
2.7 策略模式詳解 .114
2.7.1 策略模式的應(yīng)用場景 114
2.7.2 用策略模式實現(xiàn)選擇支付方式的業(yè)務(wù)場景 .114
2.7.3 策略模式在JDK源碼中的體現(xiàn) 122
2.7.4 策略模式的優(yōu)缺點 125
2.7.5 委派模式與策略模式綜合應(yīng)用 125
2.8 模板模式詳解 129
2.8.1 模板模式的應(yīng)用場景 129
2.8.2 利用模板模式重構(gòu)JDBC操作業(yè)務(wù)場景 132
2.8.3 模板模式在源碼中的體現(xiàn) 136
2.8.4 模板模式的優(yōu)缺點 138
2.9 適配器模式詳解139
2.9.1 適配器模式的應(yīng)用場景 139
2.9.2 重構(gòu)第三方登錄自由適配的業(yè)務(wù)場景141
2.9.3 適配器模式在源碼中的體現(xiàn) 149
2.9.4 適配器模式的優(yōu)缺點 153
2.10 裝飾者模式詳解 153
2.10.1 裝飾者模式的應(yīng)用場景 153
2.10.2 裝飾者模式和適配器模式對比 163
2.10.3 裝飾者模式在源碼中的應(yīng)用 163
2.10.4 裝飾者模式的優(yōu)缺點 165
2.11 觀察者模式詳解 165
2.11.1 觀察者模式的應(yīng)用場景 165
2.11.2 觀察者模式在源碼中的應(yīng)用 175
2.11.3 基于Guava API輕松落地觀察者模式 176
2.11.4 觀察者模式的優(yōu)缺點 177
2.12 各設(shè)計模式的總結(jié)與對比 177
2.12.1 GoF 23種設(shè)計模式簡介 177
2.12.2 設(shè)計模式之間的關(guān)聯(lián)關(guān)系 178
2.12.3 Spring中常用的設(shè)計模式 182
2.13 Spring中的編程思想總結(jié) 183
第2篇 Spring環(huán)境預(yù)熱
第3章 Spring的前世今生 186
3.1 一切從Bean開始 187
3.2 Spring的設(shè)計初衷 188
3.3 BOP編程伊始 188
3.4 理解BeanFactory 189
3.5 AOP編程理念 189
第4章 Spring 5系統(tǒng)架構(gòu) 191
4.1 核心容器 192
4.2 AOP和設(shè)備支持192
4.3 數(shù)據(jù)訪問與集成193
4.4 Web組件 194
4.5 通信報文 194
4.6 集成測試 194
4.7 集成兼容 194
4.8 各模塊之間的依賴關(guān)系 194
第5章 Spring版本命名規(guī)則 196
5.1 常見軟件的版本命名 196
5.2 語義化版本命名通行規(guī)則 197
5.3 商業(yè)軟件中常見的修飾詞 197
5.4 軟件版本號使用限定 198
5.5 Spring版本命名規(guī)則 199
第6章 Spring源碼下載及構(gòu)建技巧 200
6.1 Spring 5源碼下載 200
6.2 基于Gradle的源碼構(gòu)建技巧 201
6.3 Gradle構(gòu)建過程中的坑 207
第3篇 Spring核心原理
第7章 用300行代碼手寫提煉Spring核心原理 210
7.1 自定義配置 210
7.1.1 配置application.properties文件 210
7.1.2 配置web.xml文件 210
7.1.3 自定義注解 211
7.1.4 配置注解 212
7.2 容器初始化 213
7.2.1 實現(xiàn)1.0版本 213
7.2.2 實現(xiàn)2.0版本 216
7.2.3 實現(xiàn)3.0版本 223
7.3 運行效果演示 227
第8章 一步一步手繪Spring IoC運行時序圖 228
8.1 Spring核心之IoC容器初體驗 228
8.1.1 再談IoC與DI 228
8.1.2 Spring核心容器類圖 229
8.1.3 Web IoC容器初體驗 232
8.2 基于XML的IoC容器的初始化 237
8.2.1 尋找入口 238
8.2.2 獲得配置路徑 238
8.2.3 開始啟動 240
8.2.4 創(chuàng)建容器 242
8.2.5 載入配置路徑 243
8.2.6 分配路徑處理策略 244
8.2.7 解析配置文件路徑 247
8.2.8 開始讀取配置內(nèi)容 249
8.2.9 準備文檔對象 250
8.2.10 分配解析策略 251
8.2.11 將配置載入內(nèi)存 252
8.2.12 載入<bean>元素 257
8.2.13 載入<property>元素 261
8.2.14 載入<property>子元素 264
8.2.15 載入<list>子元素 266
8.2.16 分配注冊策略 267
8.2.17 向容器注冊 267
8.3 基于注解的IoC初始化 270
8.3.1 注解的前世今生 270
8.3.2 定位Bean掃描路徑 271
8.3.3 讀取注解的元數(shù)據(jù) 273
8.3.4 掃描指定包并解析為BeanDefinition 277
8.3.5 注冊注解BeanDefinition 283
8.4 IoC容器初始化小結(jié) 285
第9章 一步一步手繪Spring DI運行時序圖 287
9.1 Spring自動裝配之依賴注入 287
9.1.1 依賴注入發(fā)生的時間 287
9.1.2 尋找獲取Bean的入口 288
9.1.3 開始實例化 293
9.1.4 選擇Bean實例化策略 297
9.1.5 執(zhí)行Bean實例化 299
9.1.6 準備依賴注入 301
9.1.7 解析屬性依賴注入規(guī)則 306
9.1.8 注入賦值 310
9.2 Spring IoC容器中那些鮮為人知的細節(jié) 314
9.2.1 關(guān)于延時加載 314
9.2.2 關(guān)于FactoryBean和BeanFactory 317
9.2.3 再述autowiring 322
第10章 一步一步手繪Spring AOP運行時序圖 326
10.1 Spring AOP初體驗 326
10.1.1 再述Spring AOP應(yīng)用場景 326
10.1.2 AOP中必須明白的幾個概念 327
10.1.3 使用Spring AOP的兩種方式 329
10.1.4 切入點表達式的配置規(guī)則 333
10.2 Spring AOP源碼分析 334
10.2.1 尋找入口 334
10.2.2 選擇代理策略 338
10.2.3 調(diào)用代理方法 341
10.2.4 觸發(fā)通知 347
第11章 一步一步手繪Spring MVC運行時序圖 352
11.1 初探Spring MVC請求處理流程 352
11.2 Spring MVC九大組件 353
11.2.1 HandlerMapping 353
11.2.2 HandlerAdapter 353
11.2.3 HandlerExceptionResolver 354
11.2.4 ViewResolver 354
11.2.5 RequestToViewNameTranslator 354
11.2.6 LocaleResolver 354
11.2.7 ThemeResolver 355
11.2.8 MultipartResolver 355
11.2.9 FlashMapManager 355
11.3 Spring MVC源碼分析 355
11.3.1 初始化階段 356
11.3.2 運行調(diào)用階段 359
11.4 Spring MVC優(yōu)化建議 367
第4篇 Spring手寫實戰(zhàn)
第12章 環(huán)境準備 370
12.1 IDEA集成Lombok插件 370
12.1.1 安裝插件 370
12.1.2 配置注解處理器 373
12.1.3 使用插件 374
12.2 從Servlet到ApplicationContext 375
12.3 準備基礎(chǔ)配置376
12.3.1 application.properties配置.377
12.3.2 pom.xml配置 377
12.3.3 web.xml配置 378
12.3.4 GPDispatcherServlet 378
第13章 IoC頂層結(jié)構(gòu)設(shè)計 380
13.1 Annotation(自定義配置)模塊 380
13.1.1 @GPService 380
13.1.2 @GPAutowired 381
13.1.3 @GPController 381
13.1.4 @GPRequestMapping 382
13.1.5 @GPRequestParam 382
13.2 core(頂層接口)模塊 382
13.2.1 GPFactoryBean 382
13.2.2 GPBeanFactory 383
13.3 beans(配置封裝)模塊 383
13.3.1 GPBeanDefinition 383
13.3.2 GPBeanWrapper 384
13.4 context(IoC容器)模塊 385
13.4.1 GPAbstractApplicationContext 385
13.4.2 GPDefaultListableBeanFactory 385
13.4.3 GPApplicationContext385
13.4.4 GPBeanDefinitionReader 388
13.4.5 GPApplicationContextAware 391
第14章 完成DI模塊的功能 392
14.1 從getBean()方法開始 393
14.2 GPBeanPostProcessor 395
第15章 完成MVC模塊的功能 396
15.1 MVC頂層設(shè)計 396
15.1.1 GPDispatcherServlet 396
15.1.2 GPHandlerMapping 402
15.1.3 GPHandlerAdapter 403
15.1.4 GPModelAndView 406
15.1.5 GPViewResolver 406
15.1.6 GPView 407
15.2 業(yè)務(wù)代碼實現(xiàn)409
15.2.1 IQueryService 409
15.2.2 QueryService 410
15.2.3 IModifyService 410
15.2.4 ModifyService 411
15.2.5 MyAction 412
15.2.6 PageAction 413
15.3 定制模板頁面414
15.3.1 first.html 414
15.3.2 404.html 414
15.3.3 500.html 415
15.4 運行效果演示415
第16章 完成AOP代碼織入 417
16.1 基礎(chǔ)配置 .417
16.2 完成AOP頂層設(shè)計 418
16.2.1 GPJoinPoint 418
16.2.2 GPMethodInterceptor .419
16.2.3 GPAopConfig 419
16.2.4 GPAdvisedSupport 420
16.2.5 GPAopProxy 422
16.2.6 GPCglibAopProxy 423
16.2.7 GPJdkDynamicAopProxy 423
16.2.8 GPMethodInvocation425
16.3 設(shè)計AOP基礎(chǔ)實現(xiàn) 427
16.3.1 GPAdvice 427
16.3.2 GPAbstractAspectJAdvice 427
16.3.3 GPMethodBeforeAdvice 428
16.3.4 GPAfterReturningAdvice 429
16.3.5 GPAfterThrowingAdvice 430
16.3.6 接入getBean()方法 430
16.4 織入業(yè)務(wù)代碼432
16.4.1 LogAspect 432
16.4.2 IModifyService 433
16.4.3 ModifyService 434
16.5 運行效果演示435
第5篇 Spring數(shù)據(jù)訪問
第17章 數(shù)據(jù)庫事務(wù)原理詳解 438
17.1 從Spring事務(wù)配置說起 438
17.2 事務(wù)的基本概念 439
17.3 事務(wù)的基本原理 439
17.4 Spring事務(wù)的傳播屬性 440
17.5 數(shù)據(jù)庫事務(wù)隔離級別 441
17.6 Spring中的事務(wù)隔離級別 441
17.7 事務(wù)的嵌套 442
17.8 Spring事務(wù)API架構(gòu)圖 444
17.9 淺談分布式事務(wù) 444
第18章 Spring JDBC源碼初探 446
18.1 異常處理 447
18.2 config模塊 448
18.3 core模塊450
18.4 DataSource 456
18.5 object模塊 457
18.6 JdbcTemplate 458
18.7 NamedParameterJdbcTemplate 458
第19章 基于Spring JDBC手寫ORM框架 459
19.1 實現(xiàn)思路概述459
19.1.1 從ResultSet說起 459
19.1.2 為什么需要ORM框架 464
19.2 搭建基礎(chǔ)架構(gòu)467
19.2.1 Page 467
19.2.2 ResultMsg 470
19.2.3 BaseDao 471
19.2.4 QueryRule 473
19.2.5 Order.479
19.3 基于Spring JDBC實現(xiàn)關(guān)鍵功能 480
19.3.1 ClassMappings 480
19.3.2 EntityOperation 483
19.3.3 QueryRuleSqlBuilder 488
19.3.4 BaseDaoSupport 498
19.4 動態(tài)數(shù)據(jù)源切換的底層原理 507
19.4.1 DynamicDataSource 508
19.4.2 DynamicDataSourceEntry 509
19.5 運行效果演示510
19.5.1 創(chuàng)建Member實體類 510
19.5.2 創(chuàng)建Order實體類 511
19.5.3 創(chuàng)建MemberDao 512
19.5.4 創(chuàng)建OrderDao 512
19.5.5 修改db.properties文件 514
19.5.6 修改application-db.xml文件 515
19.5.7 編寫測試用例 516
第6篇 Spring經(jīng)驗分享
第20章 Spring 5新特性總結(jié) 520
20.1 升級到Java SE 8和Java EE 7 520
20.2 反應(yīng)式編程模型 521
20.3 使用注解進行編程 521
20.4 函數(shù)式編程 522
20.5 使用 REST 端點執(zhí)行反應(yīng)式編程 523
20.6 支持HTTP/2 523
20.7 Kotlin和Spring WebFlux 523
20.8 使用Lambda表達式注冊Bean 524
20.9 Spring Web MVC 支持最新的 API 524
20.10 使用JUnit 5執(zhí)行條件和并發(fā)測試 525
20.11 包清理和棄用 526
20.12 Spring核心和容器的一般更新 526
20.13 我如何看Spring 5 527
第21章 關(guān)于Spring的經(jīng)典高頻面試題 528
21.1 什么是Spring框架,Spring框架有哪些主要模塊 528
21.2 使用Spring框架能帶來哪些好處 528
21.3 什么是控制反轉(zhuǎn)(IoC),什么是依賴注入 529
21.4 在Java中依賴注入有哪些方式 529
21.5 BeanFactory和ApplicationContext有什么區(qū)別 530
21.6 Spring提供幾種配置方式來設(shè)置元數(shù)據(jù) 530
21.7 如何使用XML配置方式配置Spring .531
21.8 Spring提供哪些配置形式 532
21.9 怎樣用注解的方式配置Spring 533
21.10 請解釋Spring Bean的生命周期 534
21.11 Spring Bean作用域的區(qū)別是什么 535
21.12 什么是Spring Inner Bean 535
21.13 Spring中的單例Bean是線程安全的嗎 536
21.14 請舉例說明如何在Spring中注入一個Java集合 536
21.15 如何向Spring Bean中注入java.util.Properties 537
21.16 請解釋Spring Bean的自動裝配 538
21.17 自動裝配有哪些局限性 538
21.18 請解釋各種自動裝配模式的區(qū)別 539
21.19 請舉例解釋@Required注解 539
21.20 請舉例說明@Qualifier注解 540
21.21 構(gòu)造方法注入和設(shè)值注入有什么區(qū)別 540
21.22 Spring中有哪些不同類型的事件 541
21.23 FileSystemResource和ClassPathResource有什么區(qū)別 542
21.24 Spring中用到了哪些設(shè)計模式 542
21.25 在Spring中如何更有效地使用JDBC 543
21.26 請解釋Spring中的IoC容器 543
21.27 在Spring中可以注入null或空字符串嗎 543
Spring5核心原理與30個類手寫實戰(zhàn)介紹
1996年,Java還只是一個新興的、初出茅廬的編程語言。2004年3月24日Spring正式對外發(fā)布1.0版本。我在2009年開始接觸Spring2.0版本,從此愛不釋手。Spring的出現(xiàn),恰如其名開啟了全世界Java程序員的春天。如今,Spring已然成為一個生態(tài),使用Spring簡直就是一種享受。本書將結(jié)合本人多年的Spring使用經(jīng)驗,整理珍藏多年的學(xué)習(xí)筆記,采用類關(guān)系圖和代碼片段的形式,加以中文注釋,通俗、生動、全面深入地剖析了Spring源碼的重要細節(jié)。同時,本書也作為咕泡學(xué)院Java VIP高級課程的教案。要想練就"降龍十八掌”,先得修煉內(nèi)功。本書用從設(shè)計模式開始講解,希望可以幫助大家更好地理解Spring,讓大家知其然,且知其所以然。
Spring源碼框架
Sring是一個基本的框架,Spring Cloud是在Spring的基礎(chǔ)上構(gòu)建出來的。
在Spring中包含兩個基本的核心點:
第一個IOC,它表示說Spring是一個最基本的容器
第二個AOP,它提供了面向切面編程的這種思路,可以幫助我們在日志事務(wù)等各個層面,進行相關(guān)的一些擴展工作。
當(dāng)然這些都是官方的描述,其實Spring就是一個基本的框架,它提供了基本的容器功能,該容器是用來存放具體的Bean對象的,當(dāng)有了這些Bean對象后,為方便我們對Bean對象的獲取,需要先聲明好配置文件或注解,告訴Spring容器,你需要什么樣的對象。
注解或配置文件定義好就開始解析了,通過IO流,Document文檔去解析里邊的標簽,解析里邊的屬性值,解析后的文件我們稱為BeanDefinition簡稱BD,根據(jù)BD中的描述信息來進行對象的實例化操作,通過反射的方式創(chuàng)建具體的對象,之后就可以通過Context.getBean()獲取Bean對象。
Spirng作為一個容器,從創(chuàng)建到銷毀,都不需要人為干預(yù)。
作為一個框架,最基本最主要的就是擴展性,在Spring中提供了一擴展點,讓用戶來隨意進行擴展工作。在創(chuàng)建對象之前會有一個擴展點,BeanFactoryPostProcessor可以替換配置文件中的點位符,在BFPP還包含了BeanDefiintionRegistryPostProcessor可以隨意地創(chuàng)建BD對象,Sping的裝配原理:通過ConfigurationClassPostProcessor來實現(xiàn)。
Spring擴展在設(shè)計的時候留出了很多口子,讓用戶能夠進行擴展工作。
像剛剛說的兩個方法就可以擴展實現(xiàn):
第一個方法的時候,其實非常簡單,方法的參數(shù)是beanFactory,所以可以通過add,set,register的方式向容器中添加任何的對象
第二個方法OnRefresh沒有參數(shù),可以任意定義核心的功能組件,當(dāng)具體進行調(diào)用的時候,需要繼承當(dāng)前的父類,在子類方法中進行擴展實現(xiàn),調(diào)用的時候會直接找到子類方法執(zhí)行,像Spring boot中的tomcat就是通過createWebServer方法實現(xiàn)的。
在前期完成基本的擴展工作后,開始進行bean對象的實例化操作,也就是整個生命周期。具體分為實例化和初始化,其中實例化是通過CreateBeanInstance來完成的,比如有new factorybean。
AOP也是在IOC基礎(chǔ)之上完成的擴展功能。
那對象什么時候銷毀?容器關(guān)閉的時候銷毀。
- PC官方版
- 安卓官方手機版
- IOS官方手機版