Java EE 互聯網輕量級框架整合開發:SSM + Redis + Spring 微服務 (上下冊)

楊開振,劉家成

買這商品的人也買了...

商品描述

隨著移動互聯網的興起,以Java技術為後台的互聯網技術占據了市場的主導地位。在Java互聯網後台開發中,SSM框架(Spring+Spring?MVC+MyBatis)成為了主要架構,本書講述了SSM框架從入門到實際工作的要求。與此同時,為了提高系統性能,NoSQL(尤其是Redis)在互聯網系統中已經廣泛應用用,為了適應這個變化,本書通過Spring講解了有關Redis的技術應用。隨著微服務的異軍凸起,Spring微服務也成為時代的主流,本書也包括這方面的內容。本書主要分為7部分:第1部分對Java互聯網的框架和主要涉及的模式做簡單介紹;第2部分講述MyBatis技術;第3部分講述Spring基礎(包括IoC、AOP和數據庫應用),重點講解Spring數據庫事務應用,以滿足互聯網企業的應用要求;第4部分講述Spring?MVC框架;第5部分通過Spring講解Redis技術;第6部分講解Spring微服務(Spring?Boot和Spring?Cloud);第7部分結合本書內容講解Spring微服務實踐。

作者簡介

楊開振,技術暢銷書作家,精通Java 互聯網技術開發和實踐,擁有十餘年一線企業開發經驗,著有業內暢銷書《深入淺出MyBatis 技術原理與實戰》《深入淺出Spring Boot 2.x》和《Spring Cloud微服務和分佈式系統實踐》等。
寫作特點是技術點詳盡準確、文字淺顯易懂,立志於用書普及基礎技術。


劉家成,資深軟件工程師,曾任職Synnex中國、亞信國際等,在電信、分銷領域有豐富經驗,在Java高並發和Spring生態有深刻的理解。

目錄大綱

第1部分 入門和技術基礎
第1章 Java EE基礎 2
1.1 Java EE概述 2
1.1.1 Java EE容器 3
1.1.2 Java EE組件 3
1.2 開發環境簡介 4
1.2.1 Tomcat簡介 4
1.2.1 Maven 5
1.2.3 Web項目結構 6
1.2.4 Web項目發布包 7
1.3 Web容器的組件――Servlet 7
1.3.1 Servlet入門實例 7
1.3.2 Servlet的生命週期 8
1.3.3 HttpServletRequest的應用 12
1.3.4 HttpServletResponse的應用 14
1.3.5 過濾器的使用 17
1.3.6 監聽 20
1.3.7 Servlet容器初始化器 21
1.3.8 使用Cookie 23
1.3.9 提交表單 24
1.3.10 使用web. xml 26

第2章 認識SSM框架、Redis和微服務 28
2.1 Spring框架 28
2.1.1 Spring IoC簡介 28
2.1.2 Spring AOP 30
2.2 MyBatis簡介 31
2.2.1 Hibernate簡介 32
2.2.2 MyBatis 34
2.2.3 Hibernate和MyBatis的區別 35
2.3 Spring MVC簡介 36
2.4 最流行的NoSQL――Redis 36
2.5 SSM+Redis結構框圖及概述 37
2.6 Spring微服務 38

第3章 Java設計模式 40
3.1 Java反射技術 40
3.1.1 通過反射構建對象 40
3.1.2 反射方法 42
3.1.3 實例 42
3.2 動態代理模式和責任鏈模式 43
3.2.1 JDK動態代理 44
3.2.2 CGLIB動態代理 46
3.2.3 攔截器 48
3.2.4 責任鏈模式 51
3.3 觀察者模式 54
3.3.1 概述 54
3.3.2 實例 55
3.4 普通工廠模式和抽象工廠模式 58
3.4.1 普通工廠模式 58
3.4.2 抽象工廠模式 59
3.5 建造者模式 61
3.5.1 概述 61
3.5.2 Builder模式實例 62

第2部分 互聯網持久框架――MyBatis
第4章 認識MyBatis核心組件 66
4.1 持久層的概念和MyBatis的特點 66
4.2 準備MyBatis環境 67
4.3 MyBatis的核心組件 69
4.4 SqlSessionFactory 70
4.4.1 使用XML配置文件構建SqlSessionFactory對象 70
4.4.2 使用代碼構建SqlSessionFactory對象 72
4.5 SqlSession 72
4.6 映射器 73
4.6.1 用XML實現映射器 74
4.6.2 用註解實現映射器 75
4.6.3 用SqlSession發送SQL 76
4.6.4 用Mapper接口發送SQL 77
4.6.5 兩種發送SQL的方式對比 77
4.7 生命週期 77
4.7.1 SqlSessionFactoryBuilder 77
4.7.2 SqlSessionFactory 78
4.7.3 SqlSession 78
4.7.4 Mapper 78
4.8 實例 79

第5章 MyBatis配置 85
5.1 概述 85
5.2 properties屬性 86
5.2.1 property子元素 86
5.2.2 properties文件 87
5.2.3 程序代碼傳遞 87
5.3 settings配置 88
5.4 typeAliases別名 90
5.4.1 系統定義別名 91
5.4.2 自定義別名 92
5.5 typeHandler類型轉換器 93
5.5.1 系統定義的typeHandler 94
5.5.2 自定義typeHandler 98
5.5.3 枚舉typeHandler 101
5.5.4 文件操作 105
5.6 對象工廠 106
5.7 插件 108
5.8 運行環境 108
5.8.1 事務管理器 109
5.8.2 數據源環境 111
5.9 databaseIdProvider 114
5.9.1 使用系統默認的databaseIdProvider 114
5.9.2 不使用系統規則 116
5.10 引入映射器的方法 118

第6章 映射器 120
6.1 概述 120
6.2 select元素――查詢語句 121
6.2.1 簡單的select元素的應用 122
6.2.2 自動映射和駝峰映射 123
6.2.3 傳遞多個參數 124
6.2.4 使用resultMap映射結果集 127
6.2.5 分頁參數RowBounds 127
6.3 insert元素――插入語句 129
6.3.1 概述 129
6.3.2 簡單的insert語句的應用 130
6.3.3 主鍵回填 130
6.3.4 自定義主鍵 131
6.4 update元素和delete元素 132
6.5 sql元素 132
6.6 參數 133
6.6.1 概述 133
6.6.2 存儲過程參數支持 134
6.6.3 特殊字符串的替換和處理(#和$) 134
6.7 resultMap元素 134
6.7.1 resultMap元素的構成 135
6.7.2 使用Map存儲結果集 136
6.7.3 使用POJO存儲結果集 136
6.8 級聯 137
6.8.1 MyBatis中的級聯 137
6.8.2 建立POJO 140
6.8.3 配置映射文件 143
6.8.4 N+1問題 147
6.8.5 延遲加載 147
6.8.6 另一種級聯 151
6.8.7 多對多級聯 153
6.9 緩存 156
6.9.1 一級緩存和二級緩存 157
6.9.2 緩存配置項、自定義和引用 160
6.10 存儲過程 161
6.10.1 IN和OUT參數存儲過程 162
6.10.2 游標的使用 164

第7章 動態SQL 167
7.1 概述 167
7.2 if元素 167
7.3 choose、when和otherwise元素 168
7.4 trim、where和set元素 169
7.5 foreach元素 170
7.6 用test的屬性判斷字符串 171
7.7 bind元素 171

第8章 MyBatis的解析和運行原理 173
8.1 構建SqlSessionFactory過程 174
8.1.1 構建Configuration 175
8.1.2 構建映射器的內部組成 176
8.1.3 構建SqlSessionFactory 178
8.2 SqlSession運行過程 179
8.2.1 映射器的動態代理 179
8.2.2 SqlSession運行原理 183

第9章 插件 192
9.1 插件接口 192
9.2 插件的初始化 193
9.3 插件的代理和反射設計 194
9.4 常用的工具類――MetaObject 197
9.5 插件開發過程和實例 198
9.5.1 確定需要攔截的簽名 198
9.5.2 實現攔截方法 200
9.5.3 配置和運行 202
9.5.4 插件實例――分頁插件 203

第3部分 Spring基礎
第10章 Spring IoC的概念 216
10.1 Spring概述 216
10.2 Spring IoC概述 218
10.2.1 主動創建對象 219
10.2.2 被動創建對象 220
10.2.3 Spring IoC闡述 222
10.3 Spring IoC容器 223
10.3.1 Spring IoC容器的設計 223
10.3.2 Spring IoC容器的初始化 227
10.3.3 Spring Bean的生命週期 228

第11章 裝配Spring Bean 233
11.1 依賴注入和依賴查找 233
11.1.1 構造器注入 233
11.1.2 使用setter注入 234
11.1.3 依賴查找 235
11.2 裝配Bean概述 236
11.3 通過XML配置裝配Bean 237
11.3.1 裝配簡易值 237
11.3.2 裝配集合 238
11.3.3 命名空間裝配 241
11.4 通過註解裝配Bean 243
11.4.1 使用註解@Component裝配Bean 243
11.4.2 自動裝配――@Autowired 247
11.4.3 自動裝配的歧義性(註解@Primary和註解@Qualifier) 248
11.4.4 裝載帶有參數的構造方法類 251
11.4.5 使用註解@Bean裝配 252
11.4.6 註解自定義Bean的初始化和銷毀方法 253
11.5 裝配的混合使用 253
11.6 使用Profile 256
11.6.1 使用註解@Profile配置 256
11.6.2 使用XML定義Profile 257
11.6.3 啟動Profile 258
11.7 加載屬性文件 260
11.7.1 使用註解方式加載屬性文件 261
11.7.2 使用XML方式加載屬性文件 263
11.8 條件化裝配Bean 264
11.9 Bean的作用域 265
11.10 使用Spring表達式 268
11.10.1 Spring EL相關的類 268
11.10.2 Bean的屬性和方法 270
11.10.3 使用類的靜態常量和方法 271
11.10.4 Spring EL運算 271

第12章 面向切面編程 273
12.1 一個簡單的約定遊戲 273
12.1.1 約定規則 273
12.1.2 讀者的代碼 275
12.1.3 筆者的代碼 277
12.2 Spring AOP的基本概念 279
12.2.1 AOP的概念和使用原因 279
12.2.2 面向切面編程的術語 283
12.2.3 Spring對AOP的支持 285
12.3 使用註解@AspectJ開發Spring AOP 285
12.3.1 選擇連接點 285
12.3.2 創建切面 286
12.3.3 切點 287
12.3.4 測試AOP 289
12.3.5 環繞通知 291
12.3.6 織入 293
12.3.7 向通知傳遞參數 294
12.3.8 引入 295
12.4 使用XML配置開發Spring AOP 297
12.4.1 各類通知 299
12.4.2 環繞通知 301
12.4.3 向通知傳遞參數 302
12.4.4 引入 302
12.5 經典Spring AOP應用程序 303
12.6 多個切面 305

第13章 Spring和數據庫編程 311
13.1 傳統的JDBC代碼的弊端 311
13.2 配置數據庫 313
13.2.1 使用簡單數據庫配置 313
13.2.2 使用第三方數據庫連接池 314
13.2.3 使用JNDI數據庫連接池 314
13.3 JDBC代碼失控的解決方案――JdbcTemplate 315
13.3.1 JdbcTemplate的增、刪、查、改 316
13.3.2 執行多條SQL語句 317
13.3.3 JdbcTemplate的源碼分析 319
13.4 MyBatis-Spring項目 320
13.4.1 配置SqlSessionFactoryBean 321
13.4.2 SqlSessionTemplate的配置 325
13.4.3 配置MapperFactoryBean 327
13.4.4 配置MapperScannerConfigurer 327
13.4.5 定制掃描 330
13.4.6 使用Java配置文件配置MyBatis-Spring項目 331
13.4.7 測試Spring+MyBatis 333

第14章 深入Spring數據庫事務管理 336
14.1 Spring數據庫事務管理器的設計 336
14.1.1 配置事務管理器 339
14.1.2 用Java配置方式實現Spring數據庫事務 340
14.2 編程式事務 342
14.3 聲明式事務 342
14.3.1 @Transactional的配置項 343
14.3.2 使用XML配置事務管理器 344
14.3.3 事務定義器 345
14.3.4 聲明式事務的約定流程 346
14.4 數據庫的相關知識 348
14.4.1 數據庫事務ACID特性 348
14.4.2 丟失更新 348
14.4.3 隔離級別 349
14.5 選擇隔離級別和傳播行為 352
14.5.1 選擇隔離級別 352
14.5.2 傳播行為 353
14.6 在Spring+MyBatis組合中使用事務 354
14.6.1 實例 354
14.6.2 深入理解傳播行為 361
14.7 註解@Transactional的自調用失效問題 366
14.8 典型錯誤用法剖析 371
14.8.1 錯誤使用Service 371
14.8.2 長時間佔用事務 372
14.8.3 錯誤捕捉異常 374

第4部分 Spring MVC框架
第15章 Spring MVC的初始化和流程 2
15.1 MVC設計概述 2
15.1.1 Spring MVC的架構 3
15.1.2 Spring MVC組件與流程 4
15.1.3 Spring MVC入門實例 5
15.2 Spring MVC初始化 9
15.2.1 初始化Spring IoC上下文 10
15.2.2 初始化映射請求上下文 10
15.2.3 使用註解配置方式初始化 16
15.2.4 WebMvcConfigurer接口 20
15.3 Spring MVC開發流程詳解 21
15.3.1 註解@RequestMapping的使用 21
15.3.2 控制器的開發 23
15.3.3 視圖渲染 27

第16章 Spring MVC基礎組件開發 31
16.1 控制器接收各類請求參數 31
16.1.1 接收普通請求參數 32
16.1.2 使用註解@RequestParam獲取參數 34
16.1.3 使用URL傳遞參數 35
16.1.4 傳遞JSON參數 36
16.1.5 接收列表數據和表單序列化 38
16.2 重定向 41
16.3 保存並獲取屬性參數 43
16.3.1 註解@RequestAttribute 43
16.3.2 註解@SessionAttribute和註解@SessionAttributes 45
16.3.3 註解@CookieValue和註解@RequestHeader 48
16.4 驗證表單 49
16.4.1 使用JSR 303註解驗證輸入內容 49
16.4.2 使用驗證器 53
16.5 數據模型 56
16.6 視圖和視圖解析器 58
16.6.1 視圖 58
16.6.2 視圖解析器 61
16.6.3 實例:Excel視圖的使用 62
16.7 上傳文件 65
16.7.1 MultipartResolver概述 66
16.7.2 提交上傳文件表單 69

第17章 構建REST風格網站 73
17.1 REST風格的特點 73
17.1.1 REST風格的概念 73
17.1.2 註解@ResponseBody的使用 75
17.2 Spring MVC對REST風格的支持 76
17.2.1 Spring MVC支持REST風格的註解 77
17.2.2 返回結果封裝 81
17.3 RestTemplate的使用 84

第18章 Spring MVC高級應用 89
18.1 Spring MVC處理器執行的過程 89
18.1.1 HandlerMethodArgumentResolver機制 90
18.1.2 轉換器和格式化器概述 92
18.1.3 一對一轉換器(Converter) 93
18.1.4 數組和集合轉換器(GenericConverter) 96
18.1.5 格式化器(Formatter) 100
18.1.6 HttpMessageConverter消息轉換器 103
18.2 攔截器 106
18.2.1 攔截器的定義 106
18.2.2 單個攔截器的執行流程 107
18.2.3 開發攔截器 108
18.2.4 多個攔截器執行的順序 109
18.3 為控制器添加通知 112
18.4 處理異常 116
18.5 國際化 117
18.5.1 概述 117
18.5.2 MessageSource接口 119
18.5.3 CookieLocaleResolver和SessionLocaleResolver 121
18.5.4 國際化攔截器(LocaleChangeInterceptor) 122
18.5.5 開發國際化 123

第5部分 Redis應用
第19章 Redis概述 126
19.1 Redis在Java Web中的應用 127
19.1.1 緩存 127
19.1.2 高速讀/寫場景 128
19.2 Redis的安裝和使用 129
19.2.1 在Windows環境下安裝Redis 129
19.2.2 在Linux下安裝Redis 131
19.3 Redis的Java API 133
19.3.1 在Java程序中使用Redis 133
19.3.2 在Spring中使用Redis 134
19.4 Redis的數據結構簡介 141
19.5 Redis和關係數據庫的差異 142

第20章 Redis數據結構和其常用命令 144
20.1 Redis數據結構――字符串 145
20.2 Redis數據結構――哈希 150
20.3 Redis數據結構――鍊錶 154
20.4 Redis數據結構――集合 160
20.5 Redis數據結構――有序集合 163
20.5.1 Redis基礎命令 163
20.5.2 spring-data-redis對有序集合的封裝 166
20.5.3 使用Spring操作有序集合 168

第21章 Redis的一些常用技術 171
21.1 Redis事務 171
21.1.1 Redis的基礎事務 172
21.1.2 探索Redis事務回滾 174
21.1.3 使用watch命令監控事務 175
21.2 流水線 178
21.3 發布訂閱 180
21.4 超時命令 184
21.5 使用Lua語言 186
21.5.1 執行輸入Lua程序代碼 186
21.5.2 執行Lua文件 190

第22章 Redis配置 193
22.1 Redis配置文件 193
22.2 Redis備份(持久化) 194
22.2.1 快照備份 194
22.2.2 AOF備份 195
22.3 Redis內存回收策略 196
22.4 複製 197
22.4.1 主從同步基礎概念 198
22.4.2 Redis主從同步配置 198
22.4.3 Redis主從同步的過程 199
22.5 哨兵模式 201
22.5.1 哨兵模式概述 201
22.5.2 搭建哨兵模式 202
22.5.3 在Java中使用哨兵模式 204
22.5.4 哨兵模式的其他配置項 207
22.6 Redis集群 207
22.6.1 概述 207
22.6.2 搭建Redis集群 210
22.6.3 在Spring中使用Redis集群 215

第23章 Spring緩存機制和Redis的結合 217
23.1 Redis和數據庫的結合 217
23.1.1 Redis和數據庫讀操作 218
23.1.2 Redis和數據庫寫操作 219
23.2 使用Spring緩存機制整合Redis 220
23.2.1 準備測試環境 220
23.2.2 Spring的緩存管理器 224
23.2.3 緩存註解簡介 226
23.2.4 註解@Cacheable和@CachePut 226
23.2.5 註解@CacheEvict 230
23.2.6 不適用緩存的方法 231
23.2.7 自調用失效問題 231
23.2.8 Redis緩存管理器的配置――RedisCacheConfiguration 232
23.3 RedisTemplate的實例 234

第6部分 Spring微服務基礎
第24章 Spring Boot入門 238
24.1 Spring Boot的概念 238
24.1.1 什麼是Spring Boot? 238
24.1.2 為什麼要使用Spring Boot? 239
24.1.3 為什麼需要學習傳統Spring應用程序? 239
24.2 搭建Spring Boot開發環境 239
24.2.1 使用Eclipse開發Spring Boot項目 240
24.2.2 使用IntelliJ IDEA開發Spring Boot項目 242
24.2.3 運行Spring Boot項目 243
24.3 認識Spring Boot項目和開發 244
24.3.1 Spring Boot項目是如何運行的 244
24.3.2 在Spring Boot項目中如何進行自定義開發 246
24.3.3 使用JSP視圖 249

第25章 Spring Boot開發 252
25.1 使用Spring Boot開發數據庫 252
25.1.1 配置數據源 252
25.1.2 整合MyBatis 258
25.1.3 數據庫事務 264
25.2 使用Spring MVC 264
25.2.1 使用WebMvcConfigurer接口 265
25.2.2 使用Spring Boot的Spring MVC配置 266
25.2.3 使用轉換器 266
25.3 使用Redis 268
25.3.1 配置和使用Redis 268
25.3.2 使用緩存管理器 272

第26章 Spring Boot部署、測試和監控 274
26.1 打包、部署和運行Spring Boot項目 275
26.1.1 打包Spring Boot項目 275
26.1.2 運行Spring Boot項目 276
26.1.3 修改Spring Boot項目的配置 277
26.2 Spring Boot Actuator 278
26.2.1 Actuator端點簡介 278
26.2.2 保護Actuator端點 280
26.2.3 配置項 281
26.2.4 自定義端點 283
26.2.5 健康指標項 286
26.3 測試 289
26.3.1 基本測試 290
26.3.2 使用隨機端口測試REST風格的請求 291
26.3.3 Mock測試 292

第27章 Spring Cloud微服務入門 295
27.1 微服務架構的概念 295
27.1.1 微服務的風格 295
27.1.2 微服務架構總結 298
27.2 Spring Cloud基礎架構和概念 298
27.2.1 Spring Cloud概述 299
27.2.2 Spring Cloud的架構、組件和基礎概念 299
27.3 服務治理和服務發現 301
27.3.1 服務治理中心――Eureka 301
27.3.2 服務發現 303
27.3.3 高可用 305
27.3.4 基礎架構 307
27.4 服務調用――Ribbon 309
27.4.1 Ribbon概述 310
27.4.2 Ribbon實例 310
27.4.3 Ribbon工作原理 312
27.5 斷路器――Hystrix 315
27.5.1 Hystrix的使用 316
27.5.2 艙壁隔離 321
27.5.3Hystrix儀錶盤 323
27.7 服務調用――OpenFeign 327
27.7.1 入門實例 327
27.7.2 在OpenFeign中使用Hystrix 330
27.8 舊網關――Zuul 331
27.8.1 入門實例 332
27.8.2 過濾器 333
27.9 新網關――Gateway 337
27.9.1 入門實例 338
27.9.2 Gateway中的術語 340
27.9.3 Gateway已有斷言和過濾器的使用 340
27.9.4 自定義過濾器 345
27.10 新斷路器――Resilience4j 347
27.10.1 斷路器 348
27.10.2 限速器 350
27.10.3 艙壁隔離 352
27.10.4 限時器 353

第7部分 系統實踐
第28章 高並發系統設計和Spring微服務實例 356
28.1 高並發系統設計 356
28.1.1 高並發系統的優化經驗 356
28.1.2 性能 357
28.1.3 高可用 363
28.2 微服務實例 365
28.2.1 Spring Boot下的整合(product模塊) 366
28.2.2 服務調用(user模塊) 376
28.2.3 網關(gateway模塊) 378
28.2.4 測試 380

附錄A 數據庫表模型 381