mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-06-16 18:10:13 +08:00
[docs fix]typo
This commit is contained in:
parent
db60285c1e
commit
ba8eb3a3aa
@ -20,7 +20,7 @@ tag:
|
|||||||
|
|
||||||
首先,我们需要了解布隆过滤器的概念。
|
首先,我们需要了解布隆过滤器的概念。
|
||||||
|
|
||||||
布隆过滤器(Bloom Filter)是一个叫做 Bloom 的老哥于 1970 年提出的。我们可以把它看作由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。相比于我们平时常用的的 List、Map、Set 等数据结构,它占用空间更少并且效率更高,但是缺点是其返回的结果是概率性的,而不是非常准确的。理论情况下添加到集合中的元素越多,误报的可能性就越大。并且,存放在布隆过滤器的数据不容易删除。
|
布隆过滤器(Bloom Filter)是一个叫做 Bloom 的老哥于 1970 年提出的。我们可以把它看作由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。相比于我们平时常用的 List、Map、Set 等数据结构,它占用空间更少并且效率更高,但是缺点是其返回的结果是概率性的,而不是非常准确的。理论情况下添加到集合中的元素越多,误报的可能性就越大。并且,存放在布隆过滤器的数据不容易删除。
|
||||||
|
|
||||||
Bloom Filter 会使用一个较大的 bit 数组来保存所有的数据,数组中的每个元素都只占用 1 bit ,并且每个元素只能是 0 或者 1(代表 false 或者 true),这也是 Bloom Filter 节省内存的核心所在。这样来算的话,申请一个 100w 个元素的位数组只占用 1000000Bit / 8 = 125000 Byte = 125000/1024 KB ≈ 122KB 的空间。
|
Bloom Filter 会使用一个较大的 bit 数组来保存所有的数据,数组中的每个元素都只占用 1 bit ,并且每个元素只能是 0 或者 1(代表 false 或者 true),这也是 Bloom Filter 节省内存的核心所在。这样来算的话,申请一个 100w 个元素的位数组只占用 1000000Bit / 8 = 125000 Byte = 125000/1024 KB ≈ 122KB 的空间。
|
||||||
|
|
||||||
|
@ -502,9 +502,9 @@ SQL 允许在 `JOIN` 左边加上一些修饰性的关键词,从而形成不
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
如果不加任何修饰词,只写 `JOIN`,那么默认为 `INNER JOIIN`
|
如果不加任何修饰词,只写 `JOIN`,那么默认为 `INNER JOIN`
|
||||||
|
|
||||||
对于 `INNER JOIIN` 来说,还有一种隐式的写法,称为 “**隐式内连接**”,也就是没有 `INNER JOIIN` 关键字,使用 `WHERE` 语句实现内连接的功能
|
对于 `INNER JOIN` 来说,还有一种隐式的写法,称为 “**隐式内连接**”,也就是没有 `INNER JOIN` 关键字,使用 `WHERE` 语句实现内连接的功能
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
# 隐式内连接
|
# 隐式内连接
|
||||||
|
@ -91,7 +91,7 @@ Java 中的 NIO 可以看作是 **I/O 多路复用模型**。也有很多人认
|
|||||||
|
|
||||||
这个时候,**I/O 多路复用模型** 就上场了。
|
这个时候,**I/O 多路复用模型** 就上场了。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
IO 多路复用模型中,线程首先发起 select 调用,询问内核数据是否准备就绪,等内核把数据准备好了,用户线程再发起 read 调用。read 调用的过程(数据从内核空间 -> 用户空间)还是阻塞的。
|
IO 多路复用模型中,线程首先发起 select 调用,询问内核数据是否准备就绪,等内核把数据准备好了,用户线程再发起 read 调用。read 调用的过程(数据从内核空间 -> 用户空间)还是阻塞的。
|
||||||
|
|
||||||
@ -112,7 +112,7 @@ AIO 也就是 NIO 2。Java 7 中引入了 NIO 的改进版 NIO 2,它是异步 IO
|
|||||||
|
|
||||||
异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。
|
异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
目前来说 AIO 的应用还不是很广泛。Netty 之前也尝试使用过 AIO,不过又放弃了。这是因为,Netty 使用了 AIO 之后,在 Linux 系统上的性能并没有多少提升。
|
目前来说 AIO 的应用还不是很广泛。Netty 之前也尝试使用过 AIO,不过又放弃了。这是因为,Netty 使用了 AIO 之后,在 Linux 系统上的性能并没有多少提升。
|
||||||
|
|
||||||
|
@ -191,7 +191,7 @@ public String[] selectImports(AnnotationMetadata annotationMetadata) {
|
|||||||
|
|
||||||
该方法调用链如下:
|
该方法调用链如下:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
现在我们结合`getAutoConfigurationEntry()`的源码来详细分析一下:
|
现在我们结合`getAutoConfigurationEntry()`的源码来详细分析一下:
|
||||||
|
|
||||||
@ -239,11 +239,11 @@ AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoC
|
|||||||
spring-boot/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories
|
spring-boot/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories
|
||||||
```
|
```
|
||||||
|
|
||||||

|

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

|

|
||||||
|
|
||||||
不光是这个依赖下的`META-INF/spring.factories`被读取到,所有 Spring Boot Starter 下的`META-INF/spring.factories`都会被读取到。
|
不光是这个依赖下的`META-INF/spring.factories`被读取到,所有 Spring Boot Starter 下的`META-INF/spring.factories`都会被读取到。
|
||||||
|
|
||||||
@ -251,7 +251,7 @@ spring-boot/spring-boot-project/spring-boot-autoconfigure/src/main/resources/MET
|
|||||||
|
|
||||||
如果,我们自己要创建一个 Spring Boot Starter,这一步是必不可少的。
|
如果,我们自己要创建一个 Spring Boot Starter,这一步是必不可少的。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
**第 4 步**:
|
**第 4 步**:
|
||||||
|
|
||||||
@ -259,7 +259,7 @@ spring-boot/spring-boot-project/spring-boot-autoconfigure/src/main/resources/MET
|
|||||||
|
|
||||||
很明显,这是不现实的。我们 debug 到后面你会发现,`configurations` 的值变小了。
|
很明显,这是不现实的。我们 debug 到后面你会发现,`configurations` 的值变小了。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
因为,这一步有经历了一遍筛选,`@ConditionalOnXXX` 中的所有条件都满足,该类才会生效。
|
因为,这一步有经历了一遍筛选,`@ConditionalOnXXX` 中的所有条件都满足,该类才会生效。
|
||||||
|
|
||||||
@ -295,27 +295,27 @@ public class RabbitAutoConfiguration {
|
|||||||
|
|
||||||
第一步,创建`threadpool-spring-boot-starter`工程
|
第一步,创建`threadpool-spring-boot-starter`工程
|
||||||
|
|
||||||

|

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

|

|
||||||
|
|
||||||
第三步,创建`ThreadPoolAutoConfiguration`
|
第三步,创建`ThreadPoolAutoConfiguration`
|
||||||
|
|
||||||

|

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

|

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

|

|
||||||
|
|
||||||
测试通过!!!
|
测试通过!!!
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## 总结
|
## 总结
|
||||||
|
|
||||||
|
@ -463,7 +463,7 @@ MVC 是一种设计模式,Spring MVC 是一款很优秀的 MVC 框架。Spring
|
|||||||
记住了下面这些组件,也就记住了 SpringMVC 的工作原理。
|
记住了下面这些组件,也就记住了 SpringMVC 的工作原理。
|
||||||
|
|
||||||
- **`DispatcherServlet`**:**核心的中央处理器**,负责接收请求、分发,并给予客户端响应。
|
- **`DispatcherServlet`**:**核心的中央处理器**,负责接收请求、分发,并给予客户端响应。
|
||||||
- **`HandlerMapping`**:**处理器映射器**,根据 uri 去匹配查找能处理的 `Handler` ,并会将请求涉及到的拦截器和 `Handler` 一起封装。
|
- **`HandlerMapping`**:**处理器映射器**,根据 URL 去匹配查找能处理的 `Handler` ,并会将请求涉及到的拦截器和 `Handler` 一起封装。
|
||||||
- **`HandlerAdapter`**:**处理器适配器**,根据 `HandlerMapping` 找到的 `Handler` ,适配执行对应的 `Handler`;
|
- **`HandlerAdapter`**:**处理器适配器**,根据 `HandlerMapping` 找到的 `Handler` ,适配执行对应的 `Handler`;
|
||||||
- **`Handler`**:**请求处理器**,处理实际请求的处理器。
|
- **`Handler`**:**请求处理器**,处理实际请求的处理器。
|
||||||
- **`ViewResolver`**:**视图解析器**,根据 `Handler` 返回的逻辑视图 / 视图,解析并渲染真正的视图,并传递给 `DispatcherServlet` 响应客户端
|
- **`ViewResolver`**:**视图解析器**,根据 `Handler` 返回的逻辑视图 / 视图,解析并渲染真正的视图,并传递给 `DispatcherServlet` 响应客户端
|
||||||
@ -479,7 +479,7 @@ MVC 是一种设计模式,Spring MVC 是一款很优秀的 MVC 框架。Spring
|
|||||||
**流程说明(重要):**
|
**流程说明(重要):**
|
||||||
|
|
||||||
1. 客户端(浏览器)发送请求, `DispatcherServlet`拦截请求。
|
1. 客户端(浏览器)发送请求, `DispatcherServlet`拦截请求。
|
||||||
2. `DispatcherServlet` 根据请求信息调用 `HandlerMapping` 。`HandlerMapping` 根据 uri 去匹配查找能处理的 `Handler`(也就是我们平常说的 `Controller` 控制器) ,并会将请求涉及到的拦截器和 `Handler` 一起封装。
|
2. `DispatcherServlet` 根据请求信息调用 `HandlerMapping` 。`HandlerMapping` 根据 URL 去匹配查找能处理的 `Handler`(也就是我们平常说的 `Controller` 控制器) ,并会将请求涉及到的拦截器和 `Handler` 一起封装。
|
||||||
3. `DispatcherServlet` 调用 `HandlerAdapter`适配器执行 `Handler` 。
|
3. `DispatcherServlet` 调用 `HandlerAdapter`适配器执行 `Handler` 。
|
||||||
4. `Handler` 完成对用户请求的处理后,会返回一个 `ModelAndView` 对象给`DispatcherServlet`,`ModelAndView` 顾名思义,包含了数据模型以及相应的视图的信息。`Model` 是返回的数据对象,`View` 是个逻辑上的 `View`。
|
4. `Handler` 完成对用户请求的处理后,会返回一个 `ModelAndView` 对象给`DispatcherServlet`,`ModelAndView` 顾名思义,包含了数据模型以及相应的视图的信息。`Model` 是返回的数据对象,`View` 是个逻辑上的 `View`。
|
||||||
5. `ViewResolver` 会根据逻辑 `View` 查找实际的 `View`。
|
5. `ViewResolver` 会根据逻辑 `View` 查找实际的 `View`。
|
||||||
|
Loading…
x
Reference in New Issue
Block a user