mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-08-01 16:28:03 +08:00
Compare commits
18 Commits
2954d17e5f
...
cf13f46c70
Author | SHA1 | Date | |
---|---|---|---|
|
cf13f46c70 | ||
|
fb8d9647e2 | ||
|
af3a8272ae | ||
|
74ef4685e0 | ||
|
ea007df34b | ||
|
7c052503f3 | ||
|
bf84b5830d | ||
|
88cf8e4c9c | ||
|
c3c19ea8ea | ||
|
aae6016f7e | ||
|
f7060dd3df | ||
|
7a471db621 | ||
|
ed44684a9a | ||
|
c56d3aee7a | ||
|
0784c33a68 | ||
|
14bd566b5c | ||
|
2eae558109 | ||
|
a352daa897 |
@ -55,6 +55,6 @@ SOHO 子网的“代理人”,也就是和外界的窗口,通常由路由器
|
|||||||
3. WAN 的 ISP 变更接口地址时,无需通告 LAN 内主机。
|
3. WAN 的 ISP 变更接口地址时,无需通告 LAN 内主机。
|
||||||
4. LAN 主机对 WAN 不可见,不可直接寻址,可以保证一定程度的安全性。
|
4. LAN 主机对 WAN 不可见,不可直接寻址,可以保证一定程度的安全性。
|
||||||
|
|
||||||
然而,NAT 协议由于其独特性,存在着一些争议。比如,可能你已经注意到了,**NAT 协议在 LAN 以外,标识一个内部主机时,使用的是端口号,因为 IP 地址都是相同的。**这种将端口号作为主机寻址的行为,可能会引发一些误会。此外,路由器作为网络层的设备,修改了传输层的分组内容(修改了源 IP 地址和端口号),同样是不规范的行为。但是,尽管如此,NAT 协议作为 IPv4 时代的产物,极大地方便了一些本来棘手的问题,一直被沿用至今。
|
然而,NAT 协议由于其独特性,存在着一些争议。比如,可能你已经注意到了,<b>NAT 协议在 LAN 以外,标识一个内部主机时,使用的是端口号,因为 IP 地址都是相同的。</b>这种将端口号作为主机寻址的行为,可能会引发一些误会。此外,路由器作为网络层的设备,修改了传输层的分组内容(修改了源 IP 地址和端口号),同样是不规范的行为。但是,尽管如此,NAT 协议作为 IPv4 时代的产物,极大地方便了一些本来棘手的问题,一直被沿用至今。
|
||||||
|
|
||||||
<!-- @include: @article-footer.snippet.md -->
|
<!-- @include: @article-footer.snippet.md -->
|
||||||
|
@ -867,7 +867,7 @@ COMMIT;
|
|||||||
|
|
||||||
## 权限控制
|
## 权限控制
|
||||||
|
|
||||||
要授予用户帐户权限,可以用`GRANT`命令。有撤销用户的权限,可以用`REVOKE`命令。这里以 MySQl 为例,介绍权限控制实际应用。
|
要授予用户帐户权限,可以用`GRANT`命令。要撤销用户的权限,可以用`REVOKE`命令。这里以 MySQL 为例,介绍权限控制实际应用。
|
||||||
|
|
||||||
`GRANT`授予权限语法:
|
`GRANT`授予权限语法:
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ tag:
|
|||||||
|
|
||||||
1. **客户端(服务消费端)**:调用远程方法的一端。
|
1. **客户端(服务消费端)**:调用远程方法的一端。
|
||||||
1. **客户端 Stub(桩)**:这其实就是一代理类。代理类主要做的事情很简单,就是把你调用方法、类、方法参数等信息传递到服务端。
|
1. **客户端 Stub(桩)**:这其实就是一代理类。代理类主要做的事情很简单,就是把你调用方法、类、方法参数等信息传递到服务端。
|
||||||
1. **网络传输**:网络传输就是你要把你调用的方法的信息比如说参数啊这些东西传输到服务端,然后服务端执行完之后再把返回结果通过网络传输给你传输回来。网络传输的实现方式有很多种比如最近基本的 Socket 或者性能以及封装更加优秀的 Netty(推荐)。
|
1. **网络传输**:网络传输就是你要把你调用的方法的信息比如说参数啊这些东西传输到服务端,然后服务端执行完之后再把返回结果通过网络传输给你传输回来。网络传输的实现方式有很多种比如最基本的 Socket 或者性能以及封装更加优秀的 Netty(推荐)。
|
||||||
1. **服务端 Stub(桩)**:这个桩就不是代理类了。我觉得理解为桩实际不太好,大家注意一下就好。这里的服务端 Stub 实际指的就是接收到客户端执行方法的请求后,去执行对应的方法然后返回结果给客户端的类。
|
1. **服务端 Stub(桩)**:这个桩就不是代理类了。我觉得理解为桩实际不太好,大家注意一下就好。这里的服务端 Stub 实际指的就是接收到客户端执行方法的请求后,去执行对应的方法然后返回结果给客户端的类。
|
||||||
1. **服务端(服务提供端)**:提供远程方法的一端。
|
1. **服务端(服务提供端)**:提供远程方法的一端。
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ Java 阻塞队列的历史可以追溯到 JDK1.5 版本,当时 Java 平台增
|
|||||||
3. 当阻塞队列因为消费者消费过慢或者生产者存放元素过快导致队列填满时无法容纳新元素时,生产者就会被阻塞,等待队列非满时继续存放元素。
|
3. 当阻塞队列因为消费者消费过慢或者生产者存放元素过快导致队列填满时无法容纳新元素时,生产者就会被阻塞,等待队列非满时继续存放元素。
|
||||||
4. 当消费者从队列中消费一个元素之后,队列就会通知生产者队列非满,生产者可以继续填充数据了。
|
4. 当消费者从队列中消费一个元素之后,队列就会通知生产者队列非满,生产者可以继续填充数据了。
|
||||||
|
|
||||||
总结一下:阻塞队列就说基于非空和非满两个条件实现生产者和消费者之间的交互,尽管这些交互流程和等待通知的机制实现非常复杂,好在 Doug Lea 的操刀之下已将阻塞队列的细节屏蔽,我们只需调用 `put`、`take`、`offfer`、`poll` 等 API 即可实现多线程之间的生产和消费。
|
总结一下:阻塞队列就说基于非空和非满两个条件实现生产者和消费者之间的交互,尽管这些交互流程和等待通知的机制实现非常复杂,好在 Doug Lea 的操刀之下已将阻塞队列的细节屏蔽,我们只需调用 `put`、`take`、`offer`、`poll` 等 API 即可实现多线程之间的生产和消费。
|
||||||
|
|
||||||
这也使得阻塞队列在多线程开发中有着广泛的运用,最常见的例子无非是我们的线程池,从源码中我们就能看出当核心线程无法及时处理任务时,这些任务都会扔到 `workQueue` 中。
|
这也使得阻塞队列在多线程开发中有着广泛的运用,最常见的例子无非是我们的线程池,从源码中我们就能看出当核心线程无法及时处理任务时,这些任务都会扔到 `workQueue` 中。
|
||||||
|
|
||||||
|
@ -150,7 +150,7 @@ JDK 1.2 之前,Java 线程是基于绿色线程(Green Threads)实现的,
|
|||||||
|
|
||||||
## 使用多线程可能带来什么问题?
|
## 使用多线程可能带来什么问题?
|
||||||
|
|
||||||
并发编程的目的就是为了能提高程序的执行效率提高程序运行速度,但是并发编程并不总是能提高程序运行速度的,而且并发编程可能会遇到很多问题,比如:内存泄漏、死锁、线程不安全等等。
|
并发编程的目的就是为了能提高程序的执行效率进而提高程序的运行速度,但是并发编程并不总是能提高程序运行速度的,而且并发编程可能会遇到很多问题,比如:内存泄漏、死锁、线程不安全等等。
|
||||||
|
|
||||||
## 如何理解线程安全和不安全?
|
## 如何理解线程安全和不安全?
|
||||||
|
|
||||||
|
@ -81,6 +81,7 @@ public class DemoApplication {
|
|||||||
我们现在提到自动装配的时候,一般会和 Spring Boot 联系在一起。但是,实际上 Spring Framework 早就实现了这个功能。Spring Boot 只是在其基础上,通过 SPI 的方式,做了进一步优化。
|
我们现在提到自动装配的时候,一般会和 Spring Boot 联系在一起。但是,实际上 Spring Framework 早就实现了这个功能。Spring Boot 只是在其基础上,通过 SPI 的方式,做了进一步优化。
|
||||||
|
|
||||||
> SpringBoot 定义了一套接口规范,这套规范规定:SpringBoot 在启动时会扫描外部引用 jar 包中的`META-INF/spring.factories`文件,将文件中配置的类型信息加载到 Spring 容器(此处涉及到 JVM 类加载机制与 Spring 的容器知识),并执行类中定义的各种操作。对于外部 jar 来说,只需要按照 SpringBoot 定义的标准,就能将自己的功能装置进 SpringBoot。
|
> SpringBoot 定义了一套接口规范,这套规范规定:SpringBoot 在启动时会扫描外部引用 jar 包中的`META-INF/spring.factories`文件,将文件中配置的类型信息加载到 Spring 容器(此处涉及到 JVM 类加载机制与 Spring 的容器知识),并执行类中定义的各种操作。对于外部 jar 来说,只需要按照 SpringBoot 定义的标准,就能将自己的功能装置进 SpringBoot。
|
||||||
|
> 自 Spring Boot 3.0 开始,自动配置包的路径从`META-INF/spring.factories` 修改为 `META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports`。
|
||||||
|
|
||||||
没有 Spring Boot 的情况下,如果我们需要引入第三方依赖,需要手动配置,非常麻烦。但是,Spring Boot 中,我们直接引入一个 starter 即可。比如你想要在项目中使用 redis 的话,直接在项目中引入对应的 starter 即可。
|
没有 Spring Boot 的情况下,如果我们需要引入第三方依赖,需要手动配置,非常麻烦。但是,Spring Boot 中,我们直接引入一个 starter 即可。比如你想要在项目中使用 redis 的话,直接在项目中引入对应的 starter 即可。
|
||||||
|
|
||||||
|
@ -276,7 +276,7 @@ public interface TransactionStatus{
|
|||||||
|
|
||||||
### 事务属性详解
|
### 事务属性详解
|
||||||
|
|
||||||
实际业务开发中,大家一般都是使用 `@Transactional` 注解来开启事务,很多人并不清楚这个参数里面的参数是什么意思,有什么用。为了更好的在项目中使用事务管理,强烈推荐好好阅读一下下面的内容。
|
实际业务开发中,大家一般都是使用 `@Transactional` 注解来开启事务,很多人并不清楚这个注解里面的参数是什么意思,有什么用。为了更好的在项目中使用事务管理,强烈推荐好好阅读一下下面的内容。
|
||||||
|
|
||||||
#### 事务传播行为
|
#### 事务传播行为
|
||||||
|
|
||||||
|
@ -315,7 +315,7 @@ WebSocket 的工作过程可以分为以下几个步骤:
|
|||||||
|
|
||||||
另外,建立 WebSocket 连接之后,通过心跳机制来保持 WebSocket 连接的稳定性和活跃性。
|
另外,建立 WebSocket 连接之后,通过心跳机制来保持 WebSocket 连接的稳定性和活跃性。
|
||||||
|
|
||||||
SpringBoot 整合 Websocket,先引入 Websocket 相关的工具包,和 SSE 相比额外的开发成本。
|
SpringBoot 整合 WebSocket,先引入 WebSocket 相关的工具包,和 SSE 相比有额外的开发成本。
|
||||||
|
|
||||||
```xml
|
```xml
|
||||||
<!-- 引入websocket -->
|
<!-- 引入websocket -->
|
||||||
@ -374,6 +374,22 @@ public class WebSocketServer {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
服务端还需要注入`ServerEndpointerExporter`,这个 Bean 就会自动注册使用了`@ServerEndpoint`注解的 WebSocket 服务器。
|
||||||
|
|
||||||
|
```java
|
||||||
|
@Configuration
|
||||||
|
public class WebSocketConfiguration {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于注册使用了 @ServerEndpoint 注解的 WebSocket 服务器
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public ServerEndpointExporter serverEndpointExporter() {
|
||||||
|
return new ServerEndpointExporter();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
前端初始化打开 WebSocket 连接,并监听连接状态,接收服务端数据或向服务端发送数据。
|
前端初始化打开 WebSocket 连接,并监听连接状态,接收服务端数据或向服务端发送数据。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
|
Loading…
x
Reference in New Issue
Block a user