首先这个答案是否定的,Spring只是解决了单例模式下属性依赖的循环问题,Spring为了解决单例的循环依赖问题,使用了三级缓存。
HTTP Cache
HTTP Cache 的实现方式
对于一些具有重复性的 HTTP 请求,比如每次请求得到的数据都一样的,我们可以把这对 「Request - Response」 的数据缓存在本地,那么下次再次发起相同的请求,就不必要再通过网络获取服务器的响应了,很显然,这将大幅提升性能。
因此,避免发送 HTTP 请求的方法就是通过缓存技术,在 HTTP 协议头中就有不少是针对于缓存的字段。
HTTP 缓存的实现方式:
- 强制缓存
- 协商缓存
GET VS POST
GET 和 POST 的区别
RFC文档:
- GET:https://datatracker.ietf.org/doc/html/rfc7231#section-4.3.1
- POST:https://datatracker.ietf.org/doc/html/rfc7231#section-4.3.3
根据 RFC 文档规范,GET 的语义是从服务器获取指定的资源,资源形式没有限定,可以是静态文本、页面、图片、视频等等。
GET 请求参数一般是写在 URL 中的,URL 只支持 ASCLL 编码,所以 GET 请求的参数只允许是 ASCLL,像一些中文就会被转义,而且浏览器会对 URL 的长度有限制,但是 HTTP 协议本身对 URL 长度并没有做出任何规定。
根据 RFC 文档规范,POST 的语义是根据请求负荷(报文 Body)对指定资源做出操作,不同的资源类型所属的操作方式也不同。
POST 请求携带的数据一般是写在报文 Body 中,Body 中的数据可以是以任意格式存在的,只要 Client 和 Server 协商一致即可,而且浏览器也不会对 Body 的大小做出限制。
什么是 API 签名认证?
背景
首先思考一个重要的问题:如果我们为开发者提供了一个接口,却对于调用者一无所知,这是一件很恐怖的事情。
假设我们的 Server 只能够允许 100 个人同时调用接口。如果有攻击者疯狂请求这个接口,这是很危险的。一方面可能会损害我们的安全性,另一方面也可能耗尽 Server 性能,影响正常用户的使用。
因此我们必须为接口设置保护措施,例如限制每个用户每秒只能调用十次接口,即实施请求频次的限额控制。
如果在后期,我们的业务扩大,可能还需要收费。因此,我们必须知道谁在调用接口,并且不能让无权限的人随意调用。
那么现在,我们需要设计一个方法,来确定谁在调用接口。在我们之前开发后端时,我们会进行一些权限检查。例如,当管理员执行删除操作时,后端需要检查这个用户是否为管理员。那么,我们如何获取用户信息呢,是否直接从后端的 session 中获取?但问题来了,当我们调用接口时,我们有 session 吗?比如说,前端直接发起请求,没有登录操作,没有输入用户名和密码,这个时候怎么去调用呢?因此,一般情况下,我们会采用一个叫API签名认证的机制。这是一个重要的概念。
为什么说 TCP 是面向字节流协议?
前言:
TCP 是面向字节流的协议,UDP 是面向报文的协议,如何理解「面向字节流」和「面向报文」呢?
之所以会说 TCP 是面向字节流的协议,UDP 是面向报文的协议,是因为操作系统对 TCP 和UDP协议的发送方的机制不同,也就是说问题原因是在发送方。
梳理 Spring Bean 生命周期
Spring 容器可以管理 Singleton
作用域的
Bean 的生命周期,在此作用域下,Spring 能够精确地知道该 Bean
何时被创建、何时初始化完成、何时被销毁。对于
prototype
作用域的 Bean,Spring
只负责创建,当容器创建了 Bean 的实例后,Bean
的实例就交给客户端代码管理,Spring 容器不再追踪其生命周期。
TCP 三次挥手?
我们在学习 TCP 挥手的时候,学到的是需要四次来完成 TCP 挥手,但是,在一些情况下,TCP 也可以只有三次挥手。
- 为什么 RFC 文档中定义 TCP 挥手过程是 四次?
- 什么情况下会出现 三次挥手?
Lambda 转换工具类
Base Env:
Hutool Core 5.8.25
JDK 8+
概览:
- 将
Collection<OrderItem>
转化为List<OrderItem>
- 将
Collection<OrderItem>
转化为Set<OrderItem>
- 将
List<OrderItem>
转化为List<Long>
- 将
Set<OrderItem>
转化为Set<Long>
- 将
Collection<OrderItem>
转化为List<Long>
- 将
Collection<OrderItem>
转化为Set<Long>
- 从
Collection<OrderItem>
中提取Key
,Map
的Value
就是类型OrderItem
- 从
Collection<OrderItem>
中提取Key
,Map
的Value
根据OrderItem
类型进行转化。 - 将
Map<Long, OrderItem>
中的value
转化为Map<Long, Double>
value
转化时,lambda 表达式可以使用(v)->{}
, 也可以使用(k,v)->{}
。