Skip to content

Commit ba8eb3a

Browse files
committed
[docs fix]typo
1 parent db60285 commit ba8eb3a

File tree

5 files changed

+18
-18
lines changed

5 files changed

+18
-18
lines changed

docs/cs-basics/data-structure/bloom-filter.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ tag:
2020

2121
首先,我们需要了解布隆过滤器的概念。
2222

23-
布隆过滤器(Bloom Filter)是一个叫做 Bloom 的老哥于 1970 年提出的。我们可以把它看作由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。相比于我们平时常用的的 List、Map、Set 等数据结构,它占用空间更少并且效率更高,但是缺点是其返回的结果是概率性的,而不是非常准确的。理论情况下添加到集合中的元素越多,误报的可能性就越大。并且,存放在布隆过滤器的数据不容易删除。
23+
布隆过滤器(Bloom Filter)是一个叫做 Bloom 的老哥于 1970 年提出的。我们可以把它看作由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。相比于我们平时常用的 List、Map、Set 等数据结构,它占用空间更少并且效率更高,但是缺点是其返回的结果是概率性的,而不是非常准确的。理论情况下添加到集合中的元素越多,误报的可能性就越大。并且,存放在布隆过滤器的数据不容易删除。
2424

2525
Bloom Filter 会使用一个较大的 bit 数组来保存所有的数据,数组中的每个元素都只占用 1 bit ,并且每个元素只能是 0 或者 1(代表 false 或者 true),这也是 Bloom Filter 节省内存的核心所在。这样来算的话,申请一个 100w 个元素的位数组只占用 1000000Bit / 8 = 125000 Byte = 125000/1024 KB ≈ 122KB 的空间。
2626

docs/database/sql/sql-syntax-summary.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -502,9 +502,9 @@ SQL 允许在 `JOIN` 左边加上一些修饰性的关键词,从而形成不
502502

503503
![](https://oss.javaguide.cn/p3-juejin/701670942f0f45d3a3a2187cd04a12ad~tplv-k3u1fbpfcp-zoom-1.png)
504504

505-
如果不加任何修饰词,只写 `JOIN`,那么默认为 `INNER JOIIN`
505+
如果不加任何修饰词,只写 `JOIN`,那么默认为 `INNER JOIN`
506506

507-
对于 `INNER JOIIN` 来说,还有一种隐式的写法,称为 “**隐式内连接**”,也就是没有 `INNER JOIIN` 关键字,使用 `WHERE` 语句实现内连接的功能
507+
对于 `INNER JOIN` 来说,还有一种隐式的写法,称为 “**隐式内连接**”,也就是没有 `INNER JOIN` 关键字,使用 `WHERE` 语句实现内连接的功能
508508

509509
```sql
510510
# 隐式内连接

docs/java/io/io-model.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ Java 中的 NIO 可以看作是 **I/O 多路复用模型**。也有很多人认
9191

9292
这个时候,**I/O 多路复用模型** 就上场了。
9393

94-
![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/88ff862764024c3b8567367df11df6ab~tplv-k3u1fbpfcp-watermark.image)
94+
![](https://oss.javaguide.cn/github/javaguide/java/io/88ff862764024c3b8567367df11df6ab~tplv-k3u1fbpfcp-watermark.png)
9595

9696
IO 多路复用模型中,线程首先发起 select 调用,询问内核数据是否准备就绪,等内核把数据准备好了,用户线程再发起 read 调用。read 调用的过程(数据从内核空间 -> 用户空间)还是阻塞的。
9797

@@ -112,7 +112,7 @@ AIO 也就是 NIO 2。Java 7 中引入了 NIO 的改进版 NIO 2,它是异步 IO
112112

113113
异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。
114114

115-
![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3077e72a1af049559e81d18205b56fd7~tplv-k3u1fbpfcp-watermark.image)
115+
![](https://oss.javaguide.cn/github/javaguide/java/io/3077e72a1af049559e81d18205b56fd7~tplv-k3u1fbpfcp-watermark.png)
116116

117117
目前来说 AIO 的应用还不是很广泛。Netty 之前也尝试使用过 AIO,不过又放弃了。这是因为,Netty 使用了 AIO 之后,在 Linux 系统上的性能并没有多少提升。
118118

docs/system-design/framework/spring/spring-boot-auto-assembly-principles.md

+11-11
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ public String[] selectImports(AnnotationMetadata annotationMetadata) {
191191

192192
该方法调用链如下:
193193

194-
![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3c1200712655443ca4b38500d615bb70~tplv-k3u1fbpfcp-watermark.image)
194+
![](https://oss.javaguide.cn/github/javaguide/system-design/framework/spring/3c1200712655443ca4b38500d615bb70~tplv-k3u1fbpfcp-watermark.png)
195195

196196
现在我们结合`getAutoConfigurationEntry()`的源码来详细分析一下:
197197

@@ -239,27 +239,27 @@ AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoC
239239
spring-boot/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories
240240
```
241241

242-
![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/58c51920efea4757aa1ec29c6d5f9e36~tplv-k3u1fbpfcp-watermark.image)
242+
![](https://oss.javaguide.cn/github/javaguide/system-design/framework/spring/58c51920efea4757aa1ec29c6d5f9e36~tplv-k3u1fbpfcp-watermark.png)
243243

244244
从下图可以看到这个文件的配置内容都被我们读取到了。`XXXAutoConfiguration`的作用就是按需加载组件。
245245

246-
![](https://oss.javaguide.cn/p3-juejin/94d6e1a060ac41db97043e1758789026~tplv-k3u1fbpfcp-watermark.png)
246+
![](https://oss.javaguide.cn/github/javaguide/system-design/framework/spring/94d6e1a060ac41db97043e1758789026~tplv-k3u1fbpfcp-watermark.png)
247247

248248
不光是这个依赖下的`META-INF/spring.factories`被读取到,所有 Spring Boot Starter 下的`META-INF/spring.factories`都会被读取到。
249249

250250
所以,你可以清楚滴看到, druid 数据库连接池的 Spring Boot Starter 就创建了`META-INF/spring.factories`文件。
251251

252252
如果,我们自己要创建一个 Spring Boot Starter,这一步是必不可少的。
253253

254-
![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/68fa66aeee474b0385f94d23bcfe1745~tplv-k3u1fbpfcp-watermark.image)
254+
![](https://oss.javaguide.cn/github/javaguide/system-design/framework/spring/68fa66aeee474b0385f94d23bcfe1745~tplv-k3u1fbpfcp-watermark.png)
255255

256256
**第 4 步**
257257

258258
到这里可能面试官会问你:“`spring.factories`中这么多配置,每次启动都要全部加载么?”。
259259

260260
很明显,这是不现实的。我们 debug 到后面你会发现,`configurations` 的值变小了。
261261

262-
![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/267f8231ae2e48d982154140af6437b0~tplv-k3u1fbpfcp-watermark.image)
262+
![](https://oss.javaguide.cn/github/javaguide/system-design/framework/spring/267f8231ae2e48d982154140af6437b0~tplv-k3u1fbpfcp-watermark.png)
263263

264264
因为,这一步有经历了一遍筛选,`@ConditionalOnXXX` 中的所有条件都满足,该类才会生效。
265265

@@ -295,27 +295,27 @@ public class RabbitAutoConfiguration {
295295

296296
第一步,创建`threadpool-spring-boot-starter`工程
297297

298-
![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1ff0ebe7844f40289eb60213af72c5a6~tplv-k3u1fbpfcp-watermark.image)
298+
![](https://oss.javaguide.cn/github/javaguide/system-design/framework/spring/1ff0ebe7844f40289eb60213af72c5a6~tplv-k3u1fbpfcp-watermark.png)
299299

300300
第二步,引入 Spring Boot 相关依赖
301301

302-
![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5e14254276604f87b261e5a80a354cc0~tplv-k3u1fbpfcp-watermark.image)
302+
![](https://oss.javaguide.cn/github/javaguide/system-design/framework/spring/5e14254276604f87b261e5a80a354cc0~tplv-k3u1fbpfcp-watermark.png)
303303

304304
第三步,创建`ThreadPoolAutoConfiguration`
305305

306-
![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1843f1d12c5649fba85fd7b4e4a59e39~tplv-k3u1fbpfcp-watermark.image)
306+
![](https://oss.javaguide.cn/github/javaguide/system-design/framework/spring/1843f1d12c5649fba85fd7b4e4a59e39~tplv-k3u1fbpfcp-watermark.png)
307307

308308
第四步,在`threadpool-spring-boot-starter`工程的 resources 包下创建`META-INF/spring.factories`文件
309309

310-
![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/97b738321f1542ea8140484d6aaf0728~tplv-k3u1fbpfcp-watermark.image)
310+
![](https://oss.javaguide.cn/github/javaguide/system-design/framework/spring/97b738321f1542ea8140484d6aaf0728~tplv-k3u1fbpfcp-watermark.png)
311311

312312
最后新建工程引入`threadpool-spring-boot-starter`
313313

314-
![](https://oss.javaguide.cn/p3-juejin/edcdd8595a024aba85b6bb20d0e3fed4~tplv-k3u1fbpfcp-watermark.png)
314+
![](https://oss.javaguide.cn/github/javaguide/system-design/framework/spring/edcdd8595a024aba85b6bb20d0e3fed4~tplv-k3u1fbpfcp-watermark.png)
315315

316316
测试通过!!!
317317

318-
![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9a265eea4de742a6bbdbbaa75f437307~tplv-k3u1fbpfcp-watermark.image)
318+
![](https://oss.javaguide.cn/github/javaguide/system-design/framework/spring/9a265eea4de742a6bbdbbaa75f437307~tplv-k3u1fbpfcp-watermark.png)
319319

320320
## 总结
321321

docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ MVC 是一种设计模式,Spring MVC 是一款很优秀的 MVC 框架。Spring
463463
记住了下面这些组件,也就记住了 SpringMVC 的工作原理。
464464

465465
- **`DispatcherServlet`****核心的中央处理器**,负责接收请求、分发,并给予客户端响应。
466-
- **`HandlerMapping`****处理器映射器**,根据 uri 去匹配查找能处理的 `Handler` ,并会将请求涉及到的拦截器和 `Handler` 一起封装。
466+
- **`HandlerMapping`****处理器映射器**,根据 URL 去匹配查找能处理的 `Handler` ,并会将请求涉及到的拦截器和 `Handler` 一起封装。
467467
- **`HandlerAdapter`****处理器适配器**,根据 `HandlerMapping` 找到的 `Handler` ,适配执行对应的 `Handler`;
468468
- **`Handler`****请求处理器**,处理实际请求的处理器。
469469
- **`ViewResolver`****视图解析器**,根据 `Handler` 返回的逻辑视图 / 视图,解析并渲染真正的视图,并传递给 `DispatcherServlet` 响应客户端
@@ -479,7 +479,7 @@ MVC 是一种设计模式,Spring MVC 是一款很优秀的 MVC 框架。Spring
479479
**流程说明(重要):**
480480

481481
1. 客户端(浏览器)发送请求, `DispatcherServlet`拦截请求。
482-
2. `DispatcherServlet` 根据请求信息调用 `HandlerMapping` 。`HandlerMapping` 根据 uri 去匹配查找能处理的 `Handler`(也就是我们平常说的 `Controller` 控制器) ,并会将请求涉及到的拦截器和 `Handler` 一起封装。
482+
2. `DispatcherServlet` 根据请求信息调用 `HandlerMapping` 。`HandlerMapping` 根据 URL 去匹配查找能处理的 `Handler`(也就是我们平常说的 `Controller` 控制器) ,并会将请求涉及到的拦截器和 `Handler` 一起封装。
483483
3. `DispatcherServlet` 调用 `HandlerAdapter`适配器执行 `Handler` 。
484484
4. `Handler` 完成对用户请求的处理后,会返回一个 `ModelAndView` 对象给`DispatcherServlet`,`ModelAndView` 顾名思义,包含了数据模型以及相应的视图的信息。`Model` 是返回的数据对象,`View` 是个逻辑上的 `View`。
485485
5. `ViewResolver` 会根据逻辑 `View` 查找实际的 `View`。

0 commit comments

Comments
 (0)