图书目录

第1章  Java EE概述 1

1.1  Java EE发展简史 1

1.1.1  Java平台发展简史 1

1.1.2  Java EE现状 3

1.2  传统企业级应用技术的不足 6

1.2.1  规范太重 6

1.2.2  学习成本太高 7

1.2.3  不够灵活 7

1.2.4  发展缓慢 7

1.3  轻量级Java EE的技术特点 8

1.3.1  轻量级架构 8

1.3.2  符合二八定律 8

1.3.3  基于开源技术 8

1.3.4  支持微服务 9

1.3.5  可用性和扩展性 9

1.3.6  支撑大型互联网应用 10

1.4  开发环境搭建 10

1.4.1  安装JDK 10

1.4.2  Maven安装 12

1.4.3  安装Eclipse 13

1.4.4  安装IntelliJ IDEA 16

1.4.5  安装Apache Tomcat 17

1.5  总结 18

1.6  习题 19

第2章  项目管理——Maven 20

2.1  Maven概述 20

2.1.1  Maven的主要功能 20

2.1.2  创建Maven项目 21

2.1.3  探索Maven项目 23

2.1.4  构建Maven项目 26

2.2  理解Maven构建生命周期 28

2.2.1  Maven阶段 28

2.2.2  完整的生命周期阶段 29

2.2.3  生命周期阶段在命令行中的调用 30

2.2.4  使用构建生命周期来设置项目 30

2.3  理解POM 32

2.3.1  Super POM 32

2.3.2  最小化POM 35

2.4  实战:使用Eclipse创建Maven应用 36

2.4.1  创建Maven应用 36

2.4.2  运行Maven应用 38

2.4.3  导入Maven应用 40

2.4.4  相关问题解决 42

2.5  实战:使用IntelliJ IEDA创建Maven应用 43

2.5.1  创建Maven应用 43

2.5.2  运行Maven应用 45

2.5.3  导入Maven应用 47

2.5.4  相关问题解决 48

2.6  总结 48

2.7  习题 49

第3章  Web应用的基石——Servlet 50

3.1  Servlet概述 50

3.1.1  Servlet架构 50

3.1.2  Servlet生命周期 51

3.1.3  常用方法 53

3.2  Servlet容器 53

3.2.1  常用Servlet容器 54

3.2.2  Tomcat和Jetty的相同点 54

3.2.3  Tomcat和Jetty的不同点 54

3.2.4  总结 55

3.3  过滤器 55

3.3.1  什么是过滤器 55

3.3.2  过滤器生命周期 56

3.3.3  包装请求和响应 57

3.3.4  过滤器环境 57

3.3.5  Web应用中过滤器的配置 57

3.3.6  过滤器和请求分派器 58

3.4  请求 60

3.4.1  HTTP协议参数 60

3.4.2  属性 61

3.4.3  请求头 61

3.4.4  请求路径元素 61

3.4.5  路径转换方法 62

3.4.6  请求数据编码 62

3.5  Servlet上下文 63

3.5.1  ServletContext接口作用域 63

3.5.2  初始化参数 63

3.5.3  配置方法 64

3.5.4  上下文属性 66

3.5.5  资源 66

3.6  响应 67

3.6.1  缓冲 67

3.6.2  头 68

3.6.3  方法 68

3.7  监听器 69

3.7.1  事件类型和监听器接口 69

3.7.2  部署描述符示例 70

3.7.3  监听器实例和线程 71

3.7.4  监听器异常 71

3.7.5  分布式容器 71

3.7.6  会话事件 71

3.8  会话 71

3.8.1  会话跟踪机制 72

3.8.2  创建会话 72

3.8.3  会话范围 73

3.8.4  绑定属性到会话 73

3.8.5  会话超时 73

3.8.6  最后访问时间 74

3.8.7  线程问题 74

3.8.8  分布式环境 74

3.8.9  客户端语义 75

3.9  实战:创建基于Servlet的Web应用 75

3.9.1  创建动态Web项目 75

3.9.2  创建Servlet实现类 75

3.9.3  编译应用 77

3.9.4  运行应用 77

3.10  Tomcat服务器概述 77

3.10.1  Tomcat目录结构 77

3.10.2  Tomcat主要组件 78

3.10.3  Tomcat处理HTTP请求的过程 79

3.11  实战:在应用里面内嵌Tomcat容器 80

3.11.1  安装tomcat7-maven-plugin 80

3.11.2  运行应用 80

3.11.3  访问应用 81

3.12  Jetty服务器概述 81

3.12.1  高性能Servlet容器 81

3.12.2  可拔插 82

3.12.3  Jetty常用配置 82

3.13  实战:在应用里面内嵌Jetty容器 86

3.13.1  Maven插件形式 86

3.13.2  编程方式 87

3.14  总结 90

3.15  习题 90

第4章  流行的开源关系型数据库——MySQL 91

4.1  MySQL概述 91

4.1.1  MySQL名字的由来 91

4.1.2  MySQL的发展历程 92

4.1.3  MySQL的特点 93

4.2  MySQL的安装 94

4.2.1  下载安装包 94

4.2.2  解压安装包 94

4.2.3  创建my.ini 95

4.2.4  初始化安装 95

4.2.5  启动和关闭MySQL Server 95

4.3  使用MySQL客户端 96

4.4  MySQL基本操作 96

4.5  总结 97

4.6  习题 98

第5章  Java操作数据库——JDBC 99

5.1  JDBC概述 99

5.2  JDBC的核心概念 99

5.2.1  建立连接 100

5.2.2  执行SQL并操作结果集 100

5.2.3  两层模型 101

5.2.4  三层模型 102

5.2.5  JDBC与Java EE平台的关系 103

5.3  使用PreparedStatement 103

5.3.1  创建PreparedStatement对象 103

5.3.2  为什么使用PreparedStatement 104

5.4  事务管理 105

5.4.1  事务边界和自动提交 105

5.4.2  关闭自动提交模式 105

5.4.3  事务隔离级别 106

5.4.4  性能考虑 107

5.4.5  保存点 107

5.5  实战:使用JDBC操作数据库 108

5.5.1  初始化数据库 108

5.5.2  建表 108

5.5.3  初始化应用 108

5.5.4  创建测试类 110

5.6  理解连接池技术 114

5.7  实战:使用数据库连接池DBCP 114

5.7.1  添加DBCP依赖 114

5.7.2  编写数据库工具类 116

5.7.3  理解DbUtil的配置化 119

5.7.4  编写测试用例 119

5.8  总结 122

5.9  习题 122

第6章  一站式应用框架——Spring 123

6.1  Spring概述 123

6.1.1  Spring的广义与狭义 123

6.1.2  Spring框架总览 125

6.1.3  Spring框架常用模块 126

6.1.4  Spring设计模式 128

6.2  IoC 128

6.2.1  依赖注入与控制反转 128

6.2.2  IoC容器和Bean 129

6.2.3  配置元数据 130

6.2.4  实例化容器 131

6.2.5  使用容器 131

6.2.6  Bean的命名 132

6.2.7  实例化bean的方式 132

6.2.8  注入方式 135

6.2.9  实战:依赖注入的例子 137

6.2.10  依赖注入的详细配置 140

6.2.11  使用depends-on 144

6.2.12  延迟加载bean 145

6.2.13  自动装配 145

6.2.14  方法注入 147

6.2.15  bean scope 150

6.2.16  singleton bean与prototype bean 150

6.2.17  理解生命周期机制 151

6.2.18  基于注解的配置 152

6.2.19  基于注解的配置与基于XML的配置 157

6.3  AOP 157

6.3.1  AOP概述 158

6.3.2  AOP核心概念 158

6.3.3  Spring AOP 159

6.3.4  AOP代理 160

6.3.5  实战:使用@AspectJ的例子 160

6.3.6  基于XML的AOP 163

6.3.7  实战:基于XML的AOP的例子 164

6.4  资源处理 166

6.4.1  常用资源接口 166

6.4.2  内置资源接口实现 167

6.4.3  ResourceLoader 168

6.4.4  ResourceLoaderAware 168

6.4.5  资源作为依赖 169

6.5  表达式语言SpEL 169

6.5.1  表达式接口 170

6.5.2  对于bean定义的支持 171

6.5.3  实战:使用SpEL的例子 172

6.6  总结 177

6.7  习题 178

第7章  Spring测试 179

7.1  测试概述 179

7.1.1  传统的测试所面临的问题 179

7.1.2  如何破解测试面临的问题 180

7.1.3  测试类型 182

7.1.4  测试范围及比例 183

7.2  Mock对象 184

7.2.1  Environment 184

7.2.2  JNDI 184

7.2.3  Servlet API 184

7.3  测试工具类 184

7.3.1  测试工具 185

7.3.2  测试Spring Web MVC 185

7.4  测试相关的注解 185

7.4.1  @BootstrapWith 185

7.4.2  @ContextConfiguration 185

7.4.3  @WebAppConfiguration 186

7.4.4  @ContextHierarchy 187

7.4.5  @ActiveProfiles 187

7.4.6  @TestPropertySource 188

7.4.7  @DirtiesContext 188

7.4.8  @TestExecutionListeners 190

7.4.9  @Commit 190

7.4.10  @Rollback 190

7.4.11  @BeforeTransaction 191

7.4.12  @AfterTransaction 191

7.4.13  @Sql 191

7.4.14  @SqlConfig 191

7.4.15  @SqlGroup 192

7.4.16  Spring JUnit 4注解 192

7.4.17  Spring JUnit Jupiter注解 193

7.5  Spring TestContext框架 195

7.5.1  Spring TestContext框架概述 195

7.5.2  核心抽象 195

7.5.3  引导TestContext 197

7.5.4  TestExecutionListener配置 197

7.5.5  上下文管理 197

7.5.6  测试夹具的注入 198

7.5.7  如何测试request bean和session bean 199

7.5.8  事务管理 201

7.5.9  执行SQL脚本 204

7.6  Spring MVC Test框架 206

7.6.1  服务端测试概述 207

7.6.2  选择测试策略 208

7.6.3  设置测试功能 209

7.6.4  执行请求 209

7.6.5  定义期望 210

7.6.6  注册过滤器 212

7.6.7  脱离容器的测试 212

7.6.8  实战:服务端测试Spring Web MVC的例子 212

7.7  总结 216

7.8  习题 216

第8章  Spring事务管理 217

8.1  事务管理概述 217

8.1.1  Spring事务管理优势 217

8.1.2  全局事务与本地事务 218

8.1.3  Spring事务模型 218

8.2  通过事务实现资源同步 220

8.2.1  高级别的同步方法 220

8.2.2  低级别的同步方法 220

8.2.3  TransactionAwareDataSourceProxy 221

8.3  声明式事务管理 221

8.3.1  声明式事务管理 222

8.3.2  实战:声明式事务管理的例子 222

8.3.3  事务回滚 227

8.3.4  配置不同的事务策略 229

8.3.5  @Transactional详解 230

8.3.6  事务传播机制 232

8.4  编程式事务管理 233

8.4.1  TransactionTemplate 234

8.4.2  PlatformTransactionManager 234

8.4.3  声明式事务管理和编程式事务管理 235

8.5  总结 235

8.6  习题 235

第9章  MVC模式的典范——的典范LINK \l "_T 236

9.1  Spring Web MVC概述 236

9.2  DispatcherServlet 236

9.2.1  DispatcherServlet概述 237

9.2.2  上下文层次结构 238

9.2.3  处理流程 239

9.2.4  拦截 240

9.3  过滤器 240

9.3.1  HTTP PUT表单 241

9.3.2  转发头 241

9.3.3  ShallowEtagHeaderFilter 241

9.3.4  CORS 242

9.4  控制器 242

9.4.1  声明控制器 242

9.4.2  请求映射 243

9.4.3  处理器方法 244

9.4.4  模型方法 247

9.4.5  绑定器方法 247

9.5  异常处理 247

9.5.1  @ExceptionHandler 248

9.5.2  框架异常处理 248

9.5.3  REST API异常 249

9.5.4  注解异常 249

9.5.5  容器错误页面 249

9.6  CORS处理 250

9.6.1  @CrossOrigin 250

9.6.2  全局CORS配置 252

9.6.3  自定义 252

9.6.4  CORS过滤器 253

9.7  HTTP缓存 253

9.7.1  缓存控制 253

9.7.2  静态资源 254

9.7.3  控制器缓存 254

9.8  MVC配置 255

9.8.1  启用MVC配置 255

9.8.2  类型转换 256

9.8.3  验证 257

9.8.4  拦截器 257

9.8.5  内容类型 258

9.8.6  消息转换器 259

9.8.7  视图控制器 260

9.8.8  视图解析器 260

9.8.9  静态资源 261

9.8.10  DefaultServletHttpRequestHandler 261

9.8.11  路径匹配 262

9.9  实战:基于Spring Web MVC的JSON类型的处理 263

9.9.1  接口设计 263

9.9.2  系统配置 263

9.9.3  后台编码实现 264

9.9.4  应用配置 265

9.9.5  运行应用 267

9.10  实战:基于Spring Web MVC的 XML类型的处理 268

9.10.1  接口设计 268

9.10.2  系统配置 268

9.10.3  后台编码实现 269

9.10.4  应用配置 270

9.10.5  运行应用 272

9.11  总结 273

9.12  习题 273

第10章  全能安全框架——Spring Security 274

10.1  基于角色的权限管理 274

10.1.1  角色的概念 274

10.1.2  基于角色的访问控制 274

10.1.3  哪种方式更好 276

10.1.4  真实的案例 277

10.2  Spring Security概述 277

10.2.1  Spring Security的认证模型 277

10.2.2  Spring Security的安装 279

10.2.3  模块 280

10.2.4  Spring Security 5的新特性及高级功能 281

10.3  实战:基于Spring Security安全认证 284

10.3.1  添加依赖 284

10.3.2  添加业务代码 285

10.3.3  配置消息转换器 286

10.3.4  配置Spring Security 287

10.3.5  创建应用配置类 288

10.3.6  创建内嵌Jetty的服务器 288

10.3.7  应用启动器 289

10.3.8  运行应用 290

10.4  总结 291

10.5  习题 291

第11章  轻量级持久层框架——MyBatis 292

11.1  MyBatis概述 292

11.1.1  安装MyBatis 292

11.1.2  MyBatis功能架构 293

11.1.3  MyBatis的优缺点 293

11.2  MyBatis四大核心组件 293

11.2.1  SqlSessionFactoryBuilder 294

11.2.2  SqlSessionFactory 295

11.2.3  SqlSession 295

11.2.4  Mapper 295

11.3  生命周期及作用域 296

11.3.1  SqlSessionFactoryBuilder 296

11.3.2  SqlSessionFactory 296

11.3.3  SqlSession 297

11.3.4  Mapper实例 297

11.4  总结 298

11.5  习题 298

第12章  MyBatis的高级应用 299

12.1  配置文件 299

12.1.1  properties 299

12.1.2  settings 301

12.1.3  typeAliases 304

12.1.4  typeHandlers 306

12.1.5  objectFactory 309

12.1.6  plugins 309

12.1.7  environments 310

12.1.8  transactionManager 311

12.1.9  dataSource 312

12.1.10  databaseIdProvider 314

12.1.11  mappers 315

12.2  Mapper映射文件 316

12.2.1  select 316

12.2.2  insert、update和delete 318

12.2.3  处理主键 320

12.2.4  sql 321

12.2.5  参数 322

12.2.6  结果映射 323

12.2.7  自动映射 325

12.2.8  缓存 326

12.3  动态SQL 328

12.3.1  if 328

12.3.2  choose、when和otherwise 329

12.3.3  trim、where和set 329

12.3.4  foreach 331

12.3.5  bind 331

12.3.6  多数据库支持 331

12.4  常用API 332

12.4.1  SqlSessionFactoryBuilder 332

12.4.2  SqlSessionFactory 334

12.4.3  SqlSession 335

12.4.4  注解 337

12.5  常用插件 339

12.5.1  MyBatis Generator 339

12.5.2  PageHelper 341

12.6  实战:使用MyBatis操作数据库 344

12.6.1  初始化表结构 344

12.6.2  添加依赖 344

12.6.3  编写业务代码 345

12.6.4  编写配置文件 347

12.6.5  编写测试用例 348

12.6.6  运行测试用例 351

12.7  总结 353

12.8  习题 354

第13章  模板引擎——Thymeleaf 355

13.1  常用Java模板引擎 355

13.1.1  关于性能 355

13.1.2  为什么选择Thymeleaf而不是JSP 356

13.1.3  什么是Thymeleaf 359

13.1.4  Thymeleaf处理模板 359

13.1.5  标准方言 360

13.2  Thymeleaf标准方言 361

13.2.1  Thymeleaf标准表达式语法 361

13.2.2  消息表达式 362

13.2.3  变量表达式 363

13.2.4  表达式基本对象 364

13.2.5  表达式工具对象 364

13.2.6  选择表达式 365

13.2.7  链接表达式 366

13.2.8  分段表达式 366

13.2.9  字面量 367

13.2.10  算术运算 368

13.2.11  比较与相等 368

13.2.12  条件表达式 369

13.2.13  默认表达式 369

13.2.14  无操作标记 370

13.2.15  数据转换及格式化 370

13.2.16  表达式预处理 370

13.3  Thymeleaf设置属性值 370

13.3.1  设置任意属性值 371

13.3.2  设置值到指定的属性 371

13.3.3  同时设置多个值 372

13.3.4  附加和添加前缀 372

13.3.5  固定值布尔属性 372

13.3.6  默认属性处理器 373

13.3.7  支持对HTML 5友好的属性及元素名称 374

13.4  Thymeleaf迭代器与条件语句 374

13.4.1  迭代器 374

13.4.2  条件语句 377

13.5  Thymeleaf模板片段 378

13.5.1  定义和引用片段 378

13.5.2  Thymeleaf片段规范语法 379

13.5.3  不使用th:fragment 379

13.5.4  th:insert、th:replace和th:include三者的区别 379

13.6  Thymeleaf表达式基本对象 380

13.6.1  基本对象 380

13.6.2  Web上下文命名空间用于request/session属性等 381

13.6.3  Web上下文对象 382

13.7  实战:基于Thymeleaf的Web应用 382

13.7.1  添加依赖 382

13.7.2  编写控制器 383

13.7.3  应用配置 384

13.7.4  编写Thymeleaf模板 387

13.8  总结 388

13.9  习题 388

第14章  锦上添花——Bootstrap 389

14.1  Bootstrap概述 389

14.1.1  HTML 5 Doctype 390

14.1.2  响应式meta标签 390

14.1.3  Box-Sizing 390

14.1.4  Normalize.css 390

14.1.5  模板 391

14.2  Bootstrap核心概念 391

14.2.1  Bootstrap的网格系统 392

14.2.2  媒体查询 393

14.2.3  网格选项 394

14.2.4  移动设备及桌面设备 394

14.3  实战:基于Bootstrap的Web应用 395

14.3.1  引入Bootstrap库的样式 395

14.3.2  引入Bootstrap库的脚本 395

14.3.3  添加Bootstrap样式类 396

14.3.4  运行应用 397

14.4  总结 398

14.5  习题 398

第15章  REST客户端 399

15.1  RestTemplate 399

15.1.1  初始化 400

15.1.2  URI 400

15.1.3  请求头 401

15.1.4  消息体 401

15.2  WebClient 402

15.2.1  retrieve()方法 402

15.2.2  exchange()方法 403

15.2.3  请求体 403

15.2.4  生成器选项 405

15.2.5  过滤器 406

15.3  实战:基于RestTemplate的天气预报服务 406

15.3.1  添加依赖 406

15.3.2  后台编码实现 407

15.3.3  运行 412

15.4  实战:基于WebClient的文件上传和下载 414

15.4.1  添加依赖 414

15.4.2  文件上传的编码实现 414

15.4.3  文件下载的编码实现 415

15.4.4  运行 416

15.5  总结 416

15.6  习题 417

第16章  REST服务框架——Jersey 418

16.1  REST概述 418

16.1.1  REST的基本概念 418

16.1.2  REST设计原则 419

16.1.3  成熟度模型 421

16.1.4  REST API管理 422

16.1.5  常用技术 425

16.2  实战:基于Jersey的REST服务 426

16.2.1  创建一个新项目 426

16.2.2  探索项目 426

16.2.3  运行项目 431

16.3  JAX-RS核心概念 434

16.3.1  根资源类(Root Resource Classes) 434

16.3.2  参数注解(@*Param) 437

16.3.3  子资源 440

16.4  实战:基于SSE构建实时Web应用 443

16.4.1  发布-订阅模式 444

16.4.2  广播模式 447

16.5  总结 450

16.6  习题 450

第17章  全双工通信——WebSocket 451

17.1  WebSocket概述 451

17.1.1  HTTP与WebSocket对比 451

17.1.2  理解WebSocket的使用场景 452

17.2  WebSocket常用API 453

17.2.1  WebSocketHandler 453

17.2.2  WebSocket握手 454

17.2.3  部署 455

17.2.4  配置 456

17.2.5  跨域处理 458

17.3  SockJS 459

17.3.1  SockJS概述 459

17.3.2  启用SockJS 460

17.3.3  心跳 461

17.3.4  客户端断开连接 461

17.3.5  CORS处理 461

17.3.6  SockJsClient 462

17.4  STOMP 463

17.4.1  STOMP概述 463

17.4.2  启用STOMP 464

17.4.3  消息流程 466

17.4.4  处理器方法 468

17.4.5  发送消息 469

17.4.6  内嵌broker 470

17.4.7  外部broker 470

17.4.8  连接到broker 471

17.4.9  认证 471

17.4.10  用户目的地 472

17.4.11  事件和拦截 472

17.4.12  STOMP客户端 474

17.4.13  WebSocket Scope 474

17.4.14  性能优化 475

17.5  实战:基于STOMP的聊天室 477

17.5.1  聊天室项目的概述 477

17.5.2  设置broker 478

17.5.3  服务端编码 479

17.5.4  客户端编码 482

17.5.5  运行 486

17.6  总结 487

17.7  习题 487

第18章  消息通信——JMS 488

18.1  JMS概述 488

18.1.1  常用术语 488

18.1.2  使用场景 489

18.1.3  JMS规范优势 489

18.1.4  常用技术 490

18.2  Spring JMS 490

18.2.1  JmsTemplate 490

18.2.2  连接管理 491

18.2.3  目的地管理 491

18.2.4  消息监听器容器 492

18.2.5  事务管理 492

18.3  发送消息 493

18.3.1  使用消息转换器 494

18.3.2  回调 494

18.4  接收消息 494

18.4.1  同步接收 494

18.4.2  异步接收 495

18.4.3  SessionAwareMessageListener 495

18.4.4  MessageListenerAdapter 496

18.4.5  处理事务 497

18.5  基于注解的监听器 498

18.5.1  启用基于注解的监听器 498

18.5.2  编程式端点注册 499

18.5.3  基于注解的端点方法签名 499

18.5.4  响应管理 500

18.6  JMS命名空间 500

18.7  实战:基于JMS的消息发送和接收 501

18.7.1  项目概述 501

18.7.2  配置 502

18.7.3  编码实现 505

18.7.4  运行 510

18.8  总结 514

18.9  习题 514

第19章  消息通知——Email 515

19.1  Email概述 515

19.1.1  Email的起源 515

19.1.2  Spring框架对于Email的支持 516

19.2  实现发送Email 516

19.2.1  MailSender和SimpleMailMessage的基本用法 516

19.2.2  JavaMailSender和MimeMessagePreparator的用法 518

19.3  使用MimeMessageHelper 519

19.3.1  发送附件和内联资源 519

19.3.2  使用模板创建Email内容 520

19.4  实战:实现Email服务器 520

19.4.1  项目概述 520

19.4.2  Email服务器编码实现 521

19.4.3  格式化Email内容 523

19.4.4  运行 524

19.5  总结 525

19.6  习题 525

第20章  任务执行与调度 526

20.1  任务执行与调度概述 526

20.2  TaskExecutor 526

20.2.1  TaskExecutor类型 527

20.2.2  使用TaskExecutor 527

20.3  TaskScheduler 528

20.3.1  Trigger接口 529

20.3.2  实现 529

20.4  任务调度及异步执行 530

20.4.1  启用调度注解 530

20.4.2  @Scheduled 530

20.4.3  @Async 531

20.4.4  @Async的异常处理 532

20.4.5  命名空间 532

20.5  使用Quartz Scheduler 533

20.5.1  使用JobDetailFactoryBean 533

20.5.2  使用MethodInvokingJobDetailFactoryBean 534

20.6  实战:基于Quartz Scheduler天气预报系统 535

20.6.1  项目概述 535

20.6.2  后台编码实现 536

20.6.3  运行 538

20.7  总结 539

20.8  习题 540

第21章  高性能之道——缓存 541

21.1  缓存概述 541

21.2  声明式缓存注解 542

21.2.1  @Cacheable 542

21.2.2  @CachePut 543

21.2.3  @CacheEvict 543

21.2.4  @Caching 543

21.2.5  @CacheConfig 544

21.2.6  启用缓存 544

21.2.7  使用自定义缓存 545

21.3  JCache 545

21.3.1  JCache注解概述 545

21.3.2  与Spring缓存注解的差异 546

21.4  基于XML的声明式缓存 546

21.5  配置缓存存储 547

21.5.1  基于JDK的缓存 547

21.5.2  基于Ehcache的缓存 547

21.5.3  基于Caffeine的缓存 548

21.5.4  基于GemFire的缓存 548

21.5.5  基于JSR-107的缓存 548

21.6  实战:基于缓存的天气预报系统 548

21.6.1  项目概述 549

21.6.2  后台编码实现 549

21.6.3  缓存配置 550

21.6.4  运行 551

21.7  总结 551

21.8  习题 551

第22章  微服务基石——Spring Boot 552

22.1  从单块架构到微服务架构 552

22.1.1  单块架构的概念 552

22.1.2  单块架构的优缺点 553

22.1.3  如何将单块架构进化为微服务 554

22.2  微服务设计原则 555

22.2.1  拆分足够微 555

22.2.2  轻量级通信 556

22.2.3  领域驱动原则 556

22.2.4  单一职责原则 556

22.2.5  DevOps及两个比萨 557

22.2.6  不限于技术栈 557

22.2.7  可独立部署 558

22.3  Spring Boot概述 558

22.3.1  Spring Boot产生的背景 559

22.3.2  Spring Boot的目标 560

22.3.3  Spring Boot与其他Spring应用的关系 560

22.3.4  Starter 561

22.4  实战:开启第一个Spring Boot项目 563

22.4.1  通过Spring Initializr初始化一个Spring Boot原型 563

22.4.2  用Maven编译项目 565

22.4.3  探索项目 567

22.4.4  编写REST服务 571

22.5  总结 572

22.6  习题 572

第23章  微服务治理框架——Spring Cloud 574

23.1  Spring Cloud概述 574

23.1.1  什么是Spring Cloud 575

23.1.2  Spring Cloud与Spring Boot的关系 575

23.2  Spring Cloud入门配置 576

23.2.1  Maven配置 576

23.2.2  Gradle配置 577

23.2.3  声明式方法 577

23.3  Spring Cloud子项目介绍 578

23.4  实战:实现微服务的注册与发现 580

23.4.1  服务发现的意义 580

23.4.2  如何集成Eureka Server 581

23.4.3  如何集成Eureka Client 584

23.4.4  实现服务的注册与发现 588

23.5  总结 588

23.6  习题 589

附录  本书所涉及的技术及相关版本 590

参考文献 591