內容簡介
Spring 框架是以簡化J2EE 應用程式開發為特定目標而創建的,是當前最流行的Java 開發框架。本書主要介紹Beans 的配置、依賴注入、定製bean、基於Java 的容器、AOP、Spring Data、Spring MVC 等內容。本書基於非常適合構建JavaWeb 微服務框架的Spring 5 編寫,涵蓋Java 的函式式編程、RxJava 2 的反應式編程、用Spring WebFlux、Spring Data 和Spring Security 開發反應式RESTful Web 服務等內容。
本書適合Web 開發者和想使用Spring 的初學者參考,也可供對Web 開發和Spring 感興趣的讀者參考。
圖書目錄
第1 章 Spring 框架概述 1
1.1 簡介1
1.2 Spring 框架的模組.....1
1.3 Spring IoC 容器....2
1.4 使用Spring 框架的好處..4
1.4.1 管理本地和全局事務的一致方法.....4
1.4.3 安全.6
1.4.4 Java 管理擴展..7
1.4.5 Java 訊息服務..8
1.4.6 快取.8
1.5 一個簡單的Spring 應用程式9
1.5.1 確定應用程式對象及其依賴關係.....9
1.5.2 根據確定的應用程式對象
創建POJO 類.10
1.5.3 創建配置元數據..10
1.5.4 通過setter 方法注入依賴項12
1.5.5 創建一個Spring 容器的實例....14
1.5.6 從Spring 容器訪問bean15
1.6 Spring 框架5 的新功能.16
1.7 建立在Spring 之上的框架..16
1.8 小結....17
第2 章 Spring 框架基礎....18
2.1 簡介....18
提高依賴類的可測試性..19
Spring 對“面向接口編程”設計方法的
支持.....19
2.3 使用靜態和實例工廠方法創建Spring
bean.....21
2.3.1 通過靜態工廠方法實例bean.....21
2.3.2 通過實例工廠方法實例bean.....22
2.4 基於構造函式的DI..25
2.4.1 回顧基於setter 的DI 25
2.4.2 基於構造函式的DI...26
2.5 將配置詳細信息傳遞給bean....27
2.6 bean 的作用域29
2.6.1 singleton ...29
2.6.2 prototype...35
2.6.3 為你的bean 選擇適當的範圍....36
2.7 小結....36
第3 章 bean 的配置.....37
3.1 簡介....37
3.2 bean 定義的繼承.37
3.2.1 MyBank—bean 定義繼承示例.....37
3.2.2 繼承了什麼....39
3.3 構造函式參數匹配...43
3.3.1 使用元素傳遞
簡單的值和bean 引用....43
3.3.2 基於類型的構造方法參數匹配.44
3.3.3 基於名稱的構造函式參數匹配.47
3.4 配置不同類型的bean 屬性和構造函式
參數....50
3.4.1 Spring 的內置屬性編輯器....50
3.4.2 指定不同集合類型的值.52
3.4.3 指定數組的值57
3.4.4 與、和元素
相對應的默認實現....58
3.5 內置屬性編輯器.58
3.5.1 CustomCollectionEditor ..58
3.5.2 CustomMapEditor 60
3.5.3 CustomDateEditor 61
3.6 向Spring 容器註冊屬性編輯器61
3.6.1 創建一個PropertyEditorRegistrar
實現.....61
3.6.2 配置CustomEditorConfigurer 類.....62
3.7 具有p 和c 命名空間的簡明bean 定義.....62
3.7.1 p 命名空間.....63
3.7.2 c 命名空間.....63
3.8 Spring 的util 模式....65
3.8.1 元素.66
3.8.2 元素.....66
3.8.3 元素.67
3.8.4 元素..68
3.8.5 元素....68
3.8.6 元素..69
3.9 FactoryBean 接口70
3.9.1 MyBank application—將事件
存儲在資料庫中..70
3.9.2 MyBank—FactoryBean 示例..71
3.9.3 訪問FactoryBean 實例...73
2
3.10 模組化bean 配置....75
3.11 小結..75
第4 章 依賴注入....76
4.1 簡介....76
4.2 內部bean..76
4.3 使用depends-on 特性控制bean 的初始化
順序....77
4.3.1 MyBank—bean 之間隱式的
依賴關係..78
4.3.2 隱性依賴問題78
4.4 singleton 和prototype 範圍的bean 的
依賴項82
4.4.1 singleton bean 的依賴項.82
4.4.2 Prototype bean 的依賴項84
4.5 通過singleton bean 中獲取prototype bean 的
新實例86
4.5.1 ApplicationContextAware 接口.87
4.5.2 元素..88
4.5.3 元素91
4.6 自動裝配依賴項.93
4.6.1 byType .93
4.6.2 constructor 95
4.6.3 byName96
4.6.4 default / no96
4.6.5 使bean 無法用於自動裝配..97
4.6.6 自動裝配的局限性....98
4.7 小結....98
第5 章 自定義bean 和bean 定義...99
5.1 簡介....99
5.2 自定義bean 的初始化和銷毀邏輯.99
5.2.1 使Spring 調用由destroy-method
特性指定的cleanup 方法...101
5.2.2 清理方法和prototype bean 103
5.2.3 為所有bean 指定默認的bean
初始化和銷毀方法..103
5.2.4 InitializingBean 和DisposableBean
生命周期接口....103
5.2.5 JSR 250’s @PostConstruct 和
@PreDestroy 註解..103
5.3 使用BeanPostProcessor 與新創建的bean 實例
進行互動.105
5.3.1 BeanPostProcessor 示例—驗證
bean 實例106
5.3.2 BeanPostProcessor 示例—解析
bean 依賴項..109
5.3.3 FactoryBeans 的BeanPostProcessor
行為...112
5.3.4 RequiredAnnotationBeanPostProcessor....113
5.3.5 DestructionAwareBeanPostProcessor114
5.4 使用BeanFactoryPostProcessor 修改
bean 定義114
5.4.1 BeanFactoryPostProcessor 示例.....115
5.4.2 PropertySourcesPlaceholderConfigurer ..118
5.4.3 PropertyOverrideConfigurer123
5.5 小結..125
第6 章 使用Spring 進行註解驅動
開發...126
6.1 簡介..126
6.2 用@Component 標識Spring bean.126
6.3 @Autowired 通過類型自動裝配依賴項128
6.4 @Qualifier 按名稱自動裝配依賴項..131
6.4.1 使用qualifiers 自動裝配bean..132
6.4.2 創建自定義限定符註解.....133
6.5 JSR 330 的@Inject 和@Named 註解..135
Java 8 的Optional 類型.136
6.6 JSR 250 的@Resource 註解....137
6.7 @Scope、@Lazy、@DependsOn 和
@Primary 註解..138
6.7.1 @Scope...139
6.7.2 @Lazy139
6.7.3 @DependsOn142
6.7.4 @Primary142
6.8 使用@Value 簡化註解的bean 類的配置.....142
6.8.1 在@Value 註解中使用Spring
表達式語言(SpEL) ..143
6.8.2 在方法級和方法參數級使用
@Value 註解.....145
6.8.3 在SpEL 中使用數學、關係和
6.8.4 使用SpEL 獲取bean 的引用...146
6.8.5 在SpEL 中使用正則表達式....146
6.8.6 在SpEL 中使用映射和列表....146
6.8.7 在基於XML 的bean 定義中指定
SpEL 表達式147
6.9 使用Spring 的Validator 接口驗證對象.148
6.10 使用JSR 380(Bean Validation 2.0)註解
指定約束....151
3
Spring 中的JSR 380 支持152
JSR 380 有什麼新功能.....157
6.11 bean 定義配置檔案.....159
bean 定義配置檔案示例...159
6.12 小結163
第7 章 基於Java 的容器配置164
7.1 簡介..164
7.2 使用@Configuration 和@Bean 註解配置
bean...164
在@Component 和JSR 330 的@Named 類
中定義@Bean 方法.166
7.3 注入bean 依賴項....168
7.4 配置Spring 容器....170
7.5 生命周期回調...172
7.6 導入基於Java 的配置..173
解決依賴關係....174
7.7 附加主題175
7.7.1 覆蓋@Bean 方法.....175
7.7.2 配置BeanPostProcessors 和
BeanFactoryPostProcessors.178
7.7.3 導入應用程式上下文XML 檔案....178
7.7.4 有條件地包含@Bean 和
@Configuration 類...180
7.8 小結..185
第8 章 使用Spring 進行資料庫互動....186
8.1 簡介..186
8.2 MyBank 應用程式的需求..186
8.3 使用Spring JDBC 模組開發MyBank 套用
程式..187
8.3.1 配置數據源..187
8.3.2 創建使用Spring 的JDBC 模組類的
DAO ..188
8.4 使用Hibernate 開發MyBank 應用程式194
8.4.1 配置SessionFactory 實例..194
8.4.2 創建使用Hibernate API 進行資料庫
互動的DAO 195
8.5 使用Spring 的事務管理....196
8.5.1 MyBank 的事務管理需求..196
8.5.2 編程式事務管理196
8.5.4 Spring 對JTA 的支持...202
8.6 使用基於Java 的配置開發MyBank 套用
程式..203
8.6.1 配置javax.sql.DataSource ..203
8.6.2 配置Hibernate 的SessionFactory204
8.6.3 啟用@Transactional 支持...204
8.7 小結..205
第9 章 Spring Data ...206
9.1 簡介..206
9.2 核心概念和接口.....206
9.3 Spring Data JPA.209
9.3.1 代替存儲庫方法的自定義實現.210
9.3.2 將自定義方法添加到存儲庫...211
9.3.3 配置Spring Data JPA—基於
Java 的配置方法212
9.3.4 配置Spring Data JPA—
基於XML 的配置方法214
9.3.5 查詢方法215
9.4 使用Querydsl 創建查詢.....220
9.4.1 將Spring Data 與Querydsl 集成...221
9.4.2 構造Predicate ....221
9.5 按示例查詢..223
9.6 Spring Data MongoDB..224
9.6.1 建模域實體..225
9.6.2 配置Spring Data MongoDB—
基於Java 的配置.....226
9.6.3 配置Spring Data MongoDB—
基於XML 的配置...227
9.6.4 創建自定義存儲庫..228
9.6.5 將自定義方法添加到存儲庫...228
9.6.6 使用Querydsl 創建查詢.....229
9.6.7 使用Query by Example 創建查詢...230
9.7 小結..231
第10 章 使用Spring 進行訊息傳遞、
電子郵件傳送、異步方法執行
和快取...232
10.1 簡介232
10.2 MyBank 應用程式的需求232
10.3 傳送JMS 訊息233
10.3.1 配置ActiveMQ 代理以在內嵌
模式下運行234
10.3.2 配置一個JMS ConnectionFactory....234
10.3.3 使用JmsTemplate 傳送JMS 訊息...235
10.3.4 在事務中傳送JMS 訊息..236
10.3.5 動態JMS 目標和JmsTemplate
配置.239
4
10.3.6 JmsTemplate 和訊息轉換.239
10.4 接收JMS 訊息240
10.4.1 使用JmsTemplate 同步接收JMS
訊息.240
10.4.2 使用訊息偵聽器容器異步接收
JMS 訊息....240
10.4.3 使用@JmsListener 註冊JMS
偵聽器端點242
10.4.4 使用spring-messaging 模組的訊息
傳遞.243
10.5 傳送電子郵件.245
10.5.1 使用MimeMessageHelper
準備MIME 訊息...248
10.5.2 使用MimeMessagePreparator 準備
MIME 訊息249
10.6 任務調度和異步執行.249
10.6.1 TaskExecutor 接口249
10.6.2 TaskScheduler 接口....251
10.6.3 調度bean 方法的執行252
10.6.4 @Async 和@Scheduled 註解.252
10.7 快取254
10.7.1 配置一個CacheManager..255
10.7.2 快取註解—@Cacheable、
@CacheEvict 和@CachePut...255
10.7.3 使用Spring cache 模式進行快取
配置.258
10.8 運行MyBank 應用程式...259
10.9 小結261
第11 章 面向切面編程....262
11.1 簡介262
11.2 一個簡單的AOP 示例.....262
11.3 Spring AOP 框架...264
11.3.1 代理的創建265
11.3.2 expose-proxy 特性.266
11.4 切入點表達式.267
11.4.1 @Pointcut 註解267
11.4.2 execution 和args 切入點指示符....268
11.4.3 bean 切入點指示器270
11.4.4 基於註解的切入點指示符.....271
11.5 通知類型....272
11.5.1 前置通知....272
11.5.2 返回後通知272
11.5.3 拋出後通知273
11.5.4 後置通知....274
11.5.5 圍繞通知....274
11.5.6 通過實現特殊接口創建通知.275
11.6 Spring AOP - XML 模式樣式276
11.6.1 配置一個AOP 切面...276
11.6.2 配置一個通知..277
11.6.3 將切入點表達式與通知相關聯...278
11.7 小結278
第12 章 Spring Web MVC 基礎知識...279
12.1 簡介279
12.2 示例Web 項目的結構...279
12.3 了解“Hello World”網路應用程式.....280
12.3.1 HelloWorldController.java—Hello
World Web 應用程式的控制器類...280
12.3.2 helloworld.jsp—展示“Hello
World !!”訊息的JSP 頁面....282
12.3.3 myapp-config.xml—Web 套用
程式上下文XML 檔案....282
12.3.4 web.xml—Web 應用程式部署
描述符..283
12.4 DispatcherServlet—前端控制器....285
訪問ServletContext 和ServletConfig
對象...286
12.5 使用@Controller 和@RequestMapping 註解
開發控制器..287
使用註解控制器開發“Hello World”Web
應用程式.287
12.6 MyBank Web 應用程式的需求...289
12.7 Spring Web MVC 註解—
@RequestMapping 和@RequestParam ..290
12.7.1 使用@RequestMapping 將請求
映射到控制器或者控制器方法...290
12.7.2 @RequestMapping 註解方法的
參數.295
12.7.3 @RequestMapping 註解方法的
返回類型....295
12.7.4 使用@RequestParam 將請求參數
傳遞給控制器方法297
12.8 驗證300
12.9 使用@ExceptionHandler 註解處理
異常302
12.10 載入根Web 應用程式上下文XML
檔案....303
12.11 小結....304
5
第13 章 Spring Web MVC 中的驗證和
數據綁定305
13.1 簡介305
13.2 使用@ModelAttribute 註解添加和獲取
模型特性....305
13.2.1 使用方法級的@ModelAttribute
註解添加模型特性306
13.2.2 使用@ModelAttribute 註解獲取
模型特性....309
13.2.3 請求處理及@ModelAttribute 註解
的方法..310
13.2.4 使用@ModelAttribute 註解的方法
參數的行為 311
13.2.5 RequestToViewNameTranslator.... 311
13.3 使用@SessionAttributes 註解快取模型
特性312
13.4 Spring 中對數據綁定的支持314
13.4.1 WebDataBinder—Web 請求參數
的數據綁定器..316
13.4.2 配置WebDataBinder 實例.....317
13.4.3 允許或禁止欄位參與數據綁定
過程.320
13.4.4 使用BindingResult 對象檢查數據
綁定和驗證錯誤....322
13.5 Spring 中的驗證支持.323
13.5.1 使用Spring 的Validator 接口驗證
模型特性....323
13.5.2 使用JSR 380 註解指定約束..326
13.5.3 使用JSR 380 註解驗證對象..327
13.6 Spring 的form 標籤庫329
Spring 的form 標籤庫對HTML5 的支持...331
13.7 使用基於Java 的配置方式來配置Web
應用程式....331
13.8 小結333
第14 章 使用Spring Web MVC 開發
RESTful Web 服務.334
14.1 簡介334
14.2 定期存款Web 服務....334
14.3 使用Spring Web MVC實現RESTful Web
服務335
14.3.1 JSON (JavaScript 對象表示法) ....336
14.3.2 FixedDepositWS Web 服務的
實現.337
14.4 使用RestTemplate 和WebClient 訪問
RESTful Web 服務..342
14.4.1 RestTemplate 的配置.342
14.4.2 使用RestTemplate 訪問
FixedDepositWS Web 服務.....343
14.4.3 使用WebClient 異步訪問
RESTful Web 服務.347
14.5 使用HttpMessageConverter 將Java 對象
與HTTP 請求和回響相互轉換.....348
14.5 使用HttpMessageConverter 將Java 對象與HTTP 請求和回響相互轉換.....348
14.6 @PathVariable 和@MatrixVariable 註解...349
14.7 小結352
第15 章 Spring Web MVC 進階—
國際化、檔案上傳和異步請求
處理.....353
15.1 簡介353
15.2 使用處理程式攔截器對請求進行預處理
和後處理....353
實現和配置處理程式攔截器...353
15.3 使用資源束進行國際化...355
15.3.1 MyBank Web 應用程式的需求....355
15.3.2 MyBank Web 應用程式的國際化
和本地化....355
15.4 異步地處理請求...357
15.4.1 異步請求處理配置358
15.4.2 從@RequestMapping 方法返回
Callable.358
15.4.3 從@RequestMapping 方法中返回
Deffered Result.359
15.4.4 設定默認逾時時間365
15.4.5 攔截異步請求..365
15.5 Spring 中的類型轉換和格式化支持.366
15.5.1 創建自定義轉換器366
15.5.2 配置和使用自定義轉換器.....366
15.5.3 創建一個自定義的格式化器.368
15.5.4 配置一個自定義格式化器.....369
15.5.5 創建AnnotationFormatterFactory
以格式化僅使用@AmountFormat
註解的欄位369
15.5.6 配置AnnotationFormatterFactory 的
實現..370
15.6 Spring Web MVC 中的檔案上傳支持....372
15.6.1 使用CommonsMultipartResolver
上傳檔案....372
6
15.6.2 使用StandardServletMultipartResolver
上傳檔案.....374
15.7 小結374
第16 章 使用Spring Security 保護套用
程式..375
16.1 簡介375
16.2 MyBank Web 應用程式的安全性
需求375
16.3 使用Spring Security 保護MyBank Web
應用程式....376
16.3.1 Web 請求安全的配置.376
16.3.2 身份認證配置..378
16.3.3 使用Spring Security 的JSP 標籤庫
保護JSP 內容..379
16.3.4 保護方法....380
16.4 MyBank Web 應用程式—使用Spring
Security 的ACL 模組保護FixedDeposit
Details 實例383
16.4.1 部署和使用ch16-bankapp-dbsecurity
項目...383
16.4.2 存儲ACL 和用戶信息的
資料庫表....385
16.4.3 用戶認證....387
16.4.4 Web 請求安全..388
16.4.5 JdbcMutableAclService 配置..389
16.4.6 方法級安全配置....391
16.4.7 域對象實例的安全392
16.4.8 以編程方式管理ACL 條目...394
16.4.9 MutableAcl 及安全性.396
16.5 使用基於Java 的配置方法配置
Spring Security 397
16.5.1 使用WebSecurityConfigurerAdapter
類配置Web 請求安全397
16.5.2 使用GlobalMethodSecurity
Configuration 類配置方法級安全...398
16.5.3 將DelegatingFilterProxy 過濾器
註冊到ServletContext 398
16.5.4 將DispatcherServlet 和Context
LoaderListener 註冊到
ServletContext .399
16.6 小結399
第17 章 Java 的函式式編程...400
17.1 簡介400
17.2 命令式和函式式編程風格....400
17.3 lambda 表達式401
17.4 創建簡單函式和高階函式....404
17.4.1 簡單函式....405
17.4.2 高階函式....406
17.5 流API...408
中間操作和終結操作....409
延遲求值.411
順序流和並行流413
17.6 方法引用....415
17.7 小結416
第18 章 RxJava 2 的反應式編程.417
18.1 簡介417
18.2 反應式流....418
心跳監測應用程式..418
18.3 冷發布者和熱發布者.422
StockQuote 應用程式....423
18.4 背壓430
18.5 小結434
第19 章 用Spring WebFlux、Spring Data 和
Spring Security 開發反應式RESTful
Web 服務....435
19.1 簡介435
19.2 Reactor 和RxJava 2 定義的
反應式類型..435
19.3 Developing the data access layer using
Spring Data ...437
Reactor.....437
RxJava 2 ..441
19.4 使用Spring WebFlux 開發Web 層...444
編寫反應式Web 控制器.....445
配置Spring WebFlux .....445
配置ServletContext .446
使用WebClient 與反應式RESTful Web
服務互動.446
使用伺服器傳送事件接收數據.....449
19.5 保護WebFlux 應用程式的安全性....450
19.6 小結454
附錄A 下載和安裝MongoDB 資料庫...455
A.1 下載並安裝MongoDB 資料庫....455
A.2 連線MongoDB 資料庫.....455
7
附錄B 在Eclipse IDE 中導入和運行示例
項目...457
B.1 下載和安裝Eclipse IDE 和Tomcat 9 457
B.2 將示例項目導入Eclipse IDE 中..457
B.2.1 將示例項目導入Eclipse IDE 中...457
B.2.2 在Eclipse IDE 中配置M2_REPO
類路徑變數.458
B.3 在Eclipse IDE 中配置Tomcat 9 伺服器458
B.4 在Tomcat 9 伺服器上部署Web 項目.....460