读书笔记:Spring实战

第1部分 Spring基础

第1章 Spring起步 3

1.1 什么是Spring 4

Spring 的核心是一个 容器,通常称为 Spring 应用上下文,用于创建和管理应用程序组件。这些组件也可以称为bean,会在 Spring 应用上下文中装配在一起,从而形成一个完整的应用程序。

将 bean 连接在一起的行为是基于一种称为 依赖注入(DI)的模式实现的。

从历史上看,推导 Spring 应用上下文将 bean 连接在一起的方式是使用一个或多个 XML 文件

<bean id="inventoryService"class="com.example.InventoryService" />
<bean id="productService"class="com.example.ProductService" /><constructor-arg ref="inventoryService" />
</bean>

但是,在最新版本的 Spring 中,基于 Java 的配置更为常见。如下基于 Java 的配置类是与XML 配置等价的:

@Configuration 
public class ServiceConfiguration { @Bean public InventoryService inventoryService() {return new InventoryService(); } @Bean public ProductService productService() { return new ProductService(inventoryService()); } 
}

不管是使用Java还是使用 XML 的显式配置,都只有在Spring 无法自动配置组件的时候才具有必要性。
Spring Boot 是 Spring 框架的扩展。这些增强功能中最著名的就是 自动配置,Spring Boot 能够基于类路径中的条目、环境变量和其他因素,合理地猜测需要配置的组件,并将它 们连接在一起。

1.2 初始化Spring应用 6
1.2.1 使用Spring Tool Suite初始化Spring项目 7
1.2.2 检查Spring项目的结构 9

1.3 编写Spring应用 15

1.3.1 处理Web请求 16

程序清单 1.4 主页控制器

package tacos; import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.GetMapping; @Controller // 控制器
public class HomeController { @GetMapping("/") // 处理对根路径的请求public String home() { return "home"; // 返回视图名} 
}

home() 是一个简单的控制器方法。它带有 @GetMapping 注解,表明如果针对“/” 发送 HTTP GET 请求,那么将会由这个方法来处理请求。该方法所做的只是返回String类型的home 值。

1.3.2 定义视图 17

程序清单展现了基本的 Thymeleaf 模板。
程序清单 1.5 Taco Cloud 主页模板

<html xmlns="http://www.w3.org/1999/xhtml"xmlns:th="http://www.thymeleaf.org"><head><title>Taco Cloud</title></head><body><h1>Welcome to...</h1><img th:src="@{/images/TacoCloud.png}"/></body>
</html>

它使用Thymeleaf 的 th:src 属性和@{…} 表达式以便引用相对于上下文路径的图片。

1.3.3 测试控制器 18
1.3.4 构建和运行应用 19
1.3.5 了解Spring Boot
DevTools 21
1.3.6 回顾一下 23
1.4 俯瞰Spring风景线 24
1.4.1 Spring核心框架 24
1.4.2 Spring Boot 24
1.4.3 Spring Data 25
1.4.4 Spring Security 25
1.4.5 Spring Integration和
Spring Batch 25
1.4.6 Spring Cloud 26
1.4.7 Spring Native 26
1.5 小结 26
第2章 开发Web应用 27
2.1 展现信息 28
2.1.1 构建领域类 29
2.1.2 创建控制器类 32
2.1.3 设计视图 36
2.2 处理表单提交 39
2.3 校验表单输入 46
2.3.1 声明校验规则 47
2.3.2 在表单绑定的时候执行校验 49
2.3.3 展现校验错误 50
2.4 使用视图控制器 51
2.5 选择视图模板库 53
2.5.1 缓存模板 55
2.6 小结 55
第3章 使用数据 57
3.1 使用JDBC读取和写入数据 57
3.1.1 调整领域对象以适应持久化 59
3.1.2 使用JdbcTemplate 60
3.1.3 定义模式和预加载数据 66
3.1.4 插入数据 68
3.2 使用Spring Data JDBC 73
3.2.1 添加Spring Data JDBC到构建文件中 74
3.2.2 定义存储库接口 74
3.2.3 为领域类添加持久化的注解 76
3.2.4 使用CommandLineRunner预加载数据 78
3.3 使用Spring Data JPA持久化数据 80
3.3.1 添加Spring Data JPA到项目中 80
3.3.2 将领域对象标注为实体 81
3.3.3 声明JPA存储库 84
3.3.4 自定义JPA存储库 85
小结 88
第4章 使用非关系型数据 89
4.1 使用Cassandra存储库 90
4.1.1 启用Spring Data Cassandra 90
4.1.2 理解Cassandra数据模型 93
4.1.3 为Cassandra持久化映射领域类型 93
4.1.4 编写Cassandra存储库 99
4.2 编写MongoDB存储库 100
4.2.1 启用Spring Data MongoDB 101
4.2.2 将领域类型映射为文档 102
4.2.3 编写MongoDB存储库接口 105
小结 106
第5章 保护Spring 107
5.1 启用Spring Security 107
5.2 配置Spring Security 110
5.2.1 基于内存的用户详情服务 111
5.2.2 自定义用户认证 112
5.3 保护Web请求 118
5.3.1 保护请求 118
5.3.2 创建自定义的登录页 121
5.3.3 启用第三方认证 123
5.3.4 防止跨站请求伪造 126
5.4 实现方法级别的安全 127
5.5 了解用户是谁 129
小结 132
第6章 使用配置属性 133
6.1 细粒度地调整自动配置 134
6.1.1 理解Spring的环境抽象 134
6.1.2 配置数据源 136
6.1.3 配置嵌入式服务器 137
6.1.4 配置日志 138
6.1.5 使用特定的属性值 140
6.2 创建自己的配置属性 140
6.2.1 定义配置属性的持有者 143
6.2.2 声明配置属性元数据 145
6.3 使用profile进行配置 147
6.3.1 定义特定profile的属性 147
6.3.2 激活profile 149
6.3.3 使用profile条件化地创建bean 150
小结 151

第2部分 Spring集成

第7章 创建REST服务 155

7.1 编写RESTful控制器 156

本质上来讲,REST API 与web站点并没有太大的差异。它们都会应对 HTTP 的请求。但是,主要的差别在于,REST API并不会以 HTML的形式 响应这些请求,而一般会以面向数据的格式,比如 JSON 或 XML。

7.1.1 从服务器中检索数据 156
7.1.2 发送数据到服务器端 162
7.1.3 在服务器上更新数据 163
7.1.4 删除服务器上的数据 165
7.2 启用数据后端服务 165
7.2.1 调整资源路径和关系名称 168
7.2.2 分页和排序 170
7.3 消费REST服务 171
7.3.1 GET资源 173
7.3.2 PUT资源 174
7.3.3 DELETE资源 174
7.3.4 POST资源 175
小结 176
第8章 保护REST 177
8.1 OAuth 2简介 178
8.2 创建授权服务器 183
8.3 使用资源服务器保护API 190
8.4 开发客户端 193
小结 198

第9章 发送异步消息 199

Spring 提供的3种异步消息方案:Java 消息服务(JMS)、 RabbitMQ 及高级消息队列协议(AMQP)、 Apache Kafka。

9.1 使用JMS发送消息 200
9.1.1 搭建JMS环境 200
9.1.2 使用JmsTemplate发送消息 202
9.1.3 接收JMS消息 210

9.2 使用RabbitMQ和 AMQP 214

而 AMQP 消息使用交换机和路由键来寻址,这样可以使消息与接收者要监听的队列解耦。

flowchart LR     Send[发送者]-->SW     subgraph one[RabbitMQ代理]     SW[交换机]Queue1[队列]Queue2[队列]SW--绑定-->Queue1     SW--绑定-->Queue2     end     Queue1-->Recv1[接收者]     Queue2-->Recv2[接收者]

9.2.1 添加RabbitMQ到Spring中 215
9.2.2 通过RabbitTemplate发送消息 216
9.2.3 接收来自RabbitMQ的消息 220
9.3 使用Kafka的消息 224
9.3.1 为Spring搭建支持Kafka消息的环境 224
9.3.2 通过KafkaTemplate发送消息 226
9.3.3 编写Kafka监听器 228
小结 229
第10章 Spring集成 231
10.1 声明一个简单的集成流 232
10.1.1 使用XML定义集成流 233
10.1.2 使用Java配置集成流 235
10.1.3 使用Spring Integration的DSL配置 237
10.2 Spring Integration功能概览 238
10.2.1 消息通道 239
10.2.2 过滤器 240
10.2.3 转换器 241
10.2.4 路由器 243
10.2.5 切分器 244
10.2.6 服务激活器 247
10.2.7 网关 249
10.2.8 通道适配器 250
10.2.9 端点模块 252
10.3 创建电子邮件集成流 253
小结 261
第3部分 反应式Spring

第11章 理解反应式编程 265

11.1 反应式编程概览 266
11.1.1 定义反应式流 267

11.2 初识Reactor 269

反应式编程意味着我们不再描述每一步要进行的步骤,而要构建数据将要流经的管道。
例如,假设我们想要接受一个英文人名,然后将所有字母都转换为大写。使用命令式编程模型,代码看起来如下所示:

String name = "Craig"; 
String capitalName = name.toUpperCase(); String greeting = "Hello, " + capitalName + "!"; 
System.out.println(greeting);

反应式代码:

Mono.just("Craig") .map(n -> n.toUpperCase()) .map(cn -> "Hello, " + cn + "!") .subscribe(System.out::println);

11.2.1 绘制反应式流图 270
11.2.2 添加Reactor依赖 271
11.3 使用常见的反应式操作 272
11.3.1 创建反应式类型 272
11.3.2 组合反应式类型 276
11.3.3 转换和过滤反应式流 280
11.3.4 在反应式类型上执行逻辑操作 290
小结 292
第12章 开发反应式API 293
12.1 使用Spring WebFlux 293
12.1.1 Spring WebFlux简介 294
12.1.2 编写反应式控制器 296
12.2 定义函数式请求处理器 300
12.3 测试反应式控制器 304
12.3.1 测试GET请求 304
12.3.2 测试POST请求 307
12.3.3 使用实时服务器进行测试 308
12.4 反应式消费REST API 309
12.4.1 获取资源 310
12.4.2 发送资源 312
12.4.3 删除资源 313
12.4.4 处理错误 313
12.4.5 交换请求 315
12.5 保护反应式Web API 316
12.5.1 配置反应式Web应用的安全性 317
12.5.2 配置反应式的用户详情服务 318
12.6 小结 320
第13章 反应式持久化数 321
13.1 使用R2DBC 321
13.1.1 为R2DBC定义领域实体 322
13.1.2 定义反应式存储库 326
13.1.3 测试R2DBC存储库 328
13.1.4 定义OrderRepository的聚合根服务 330
13.2 反应式地持久化MongoDB文档数据 336
13.2.1 定义领域文档类型 337
13.2.2 定义反应式MongoDB存储库 340
13.2.3 测试反应式MongoDB存储库 340
13.3 反应式地持久化Cassandra数据 344
13.3.1 定义使用Cassandra持久化的领域类 344
13.3.2 创建反应式Cassandra存储库 348
13.3.3 测试反应式Cassandra存储库 349
小结 351
第14章 使用RSocket 353
14.1 RSocket概览 354
14.2 创建简单的RSocket服务器和客户端 355
14.2.1 使用请求-响应通信模型 356
14.2.2 处理请求-流的消息 359
14.2.3 发送即发即忘的消息 361
14.2.4 双向发送消息 363
14.3 通过WebSocket传输RSocket 366
小结 367
第4部分 部署Spring
第15章 使用Spring Boot Actuator 371
15.1 Actuator概览 371
15.1.1 配置Actuator的基础路径 373
15.1.2 启用和禁用Actuator端点 373
15.2 消费Actuator端点 374
15.2.1 获取应用的基础信息 375
15.2.2 查看配置细节 378
15.2.3 查看应用的活动 386
15.2.4 挖掘应用运行时的指标 388
15.3 自定义Actuator 391
15.3.1 为“/info”端点提供息 391
15.3.2 实现自定义的健康指示器 396
15.3.3 注册自定义的指标 398
15.3.4 创建自定义的端点 399
15.4 确保Actuator的安全 402
小结 404
第16章 管理Spring 405
16.1 使用Spring Boot
Admin 405
16.1.1 创建Admin服务器 406
16.1.2 注册Admin客户端 407
16.2 探索Admin服务器 409
16.2.1 查看应用基本的健康状况和信息 409
16.2.2 观察核心指标 410
16.2.3 探查环境属性 410
16.2.4 查看和设置日志级别 411
16.3 保护Admin服务器 412
16.3.1 为Admin服务器启用登录功能 412
16.3.2 为Actuator启用认证 413
小结 414
第17章 使用JMX监控Spring 415
17.1 使用Actuator MBean 415
17.2 创建自己的MBean 418
17.3 发送通知 419
17.4 小结 421
第18章 部署Spring 423
18.1 权衡各种部署方案 424
18.2 构建可执行JAR文件 425
18.3 构建容器镜像 426
18.3.1 部署至Kubernetes 428
18.3.2 启用优雅关机功能 430
18.3.3 处理应用程序的存活和就绪状态 431
18.4 构建和部署WAR文件 434
18.5 以终为始 436
18.6 小结 436
附录 初始化Spring应用 437
A.1 使用Spring Tool Suite初始化项目 437
A.2 使用IntelliJ IDEA初始化项目 440
A.3 使用NetBeans初始化项目 441
A.4 在start.spring.io中初始化项目 445
A.5 使用命令行初始化项目 447
A.5.1 curl和Initializr API 448
A.5.2 Spring Boot命令行接口 449
A.6 构建和运行项目 450

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/899078.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信息检索系统评估指标的层级分析:从单点精确度到整体性能度量

在构建搜索引擎系统时,有效的评估机制是保证系统质量的关键环节。当用户输入查询词如"machine learning tutorials python",系统返回结果列表后,如何客观评估这些结果的相关性和有效性?这正是信息检索评估指标的核心价值所在。 分析用户与搜索引擎的交互模式,我…

[题目记录] CF1793F Rebrending

一道小清新支配对数据结构 , 非常轻松娱乐的同时足够educational , 好题 .题意 一个 \(n\) 个数的序列 , \(q\) 次询问 . 每次问区间 $ [l,r]$ 中选择两个数,他们的差的绝对值最小是多少 . 题解 注意到这道题不是很好用传统的数据结构维护 . 但是这个形式存在很明显的支配关系…

ollama系列1:轻松3步本地部署deepseek,普通电脑可用

本文主要介绍如何通过ollama快速部署deepseek、qwq、llama3、gemma3等大模型,网速好的小伙伴10分钟就能搞定。让你摆脱GPU焦虑,在普通电脑上面玩转大模型。 安装指南(无废话版) 第一步:安装ollama 我们可以从官网下载ollama,此步骤支持windows、mac、ubuntu操作系统,此处…

用正则表达式做爬取--java进阶day06

1.String类中与正则有关的方法replaceAll方法中要填入两个正则表达式,第一个是我们要修改的字符串,第二个则是我们要改成以后的字符串 如下图,出师表中存在很多数字,我们要删去这些数字,就可以使用该方法2.使用正则表达式做爬取 如图,我们要从这些文字中获取有效的信息,…

delphi12 Android Edit SDK安装

安装 delphi 12.1 后,编译 FMX Android 程序失败! 查找原因,SDK配置全是叹号! 之前用过SDK Manager.exe,直接打开即可以选择下载,但现在发现没有了,查找资料如下方法即可:1.先进到命令行:进入到对应目录(根据以下提示,找到你的目录):CD C:\Users\Public\Documents…

8.5.6 训练

下面讲一下分离梯度到底是个什么事,利用下面的图假设不使用detach_(),那么在图中,两个\(h_3\)就是相同的,于是在第二个批次对\(L_2\)进行反向传播的时候,就会退回到第一个批次的计算图中;如果使用detach_(),那么中间的黑色的连线就没有了,于是就会只计算第二个图的梯度…

按钮权限的设计及实现

说明该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。说明:OverallAuth2.0 是一个简单、易懂、功能强大的权限+可视化流程管理系统。 友情提醒:本篇文章是属于系列文章,…

Java对象的“自我介绍术”:彻底搞懂toString()魔法

本文以Java中toString()方法的底层原理与实践应用为核心,通过案例分析与代码实战,系统解析了该方法在对象调试、日志输出等场景中的重要性,并提供了一套完整的开发指导方案。前言 当小Z在咖啡馆调试代码时,打印了Java对象,看着控制台输出的Student@2f4d3709陷入困惑。这个…

读DAMA数据管理知识体系指南20数据安全风险

读DAMA数据管理知识体系指南20数据安全风险1. 数据安全制约因素 1.1. 保密等级1.1.1. 保密意味着机密或私密1.1.2. 机密信息仅在“需要知道”的基础上共享1.1.3. 保密等级取决于谁需要知道某些类型的信息1.2. 监管要求1.2.1. 根据外部规则(如法律、条约、海关协定和行业法规)…

git 已知问题 命令行调用 git 时可能存在环境变量投毒问题

本文记录一个我在 git 钩子唤起一个 C# dotnet 的进程,在此进程里面使用 Process.Start 执行 git 命令的时候,被 git 钩子环境变量投毒的问题核心代码非常简单,我只是使用 git add 命令而已var sourceFolder = @"C:\lindexi\Work\Source\";var processStartInfo =…

eSIM神器之ESTK记录

本文内容一部分引用“ 灯塔旅人”公众号文章内容。 先说原理: 原理 ⚡️普通手机:营业厅将信息写入实体SIM中,然后插入手机,实现相关功能; ⚡️eSIM手机:内置了eSIM芯片,可以直接扫码写入运营商提供的eSIM并支持切换; ⚡️ESTK:形象地比喻为将eSIM手机中eSIM芯片取出,…