双指针算法

双指针是一种重要的算法技巧,使用两个指针对数组或链表进行操作。

一、对撞指针

对撞指针是指两个指针从数组的两端向中间移动。

1. 经典问题:两数之和

给定一个已按照升序排列的数组,找出两个数使得它们的和等于目标数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public int[] twoSum(int[] nums, int target) {
int left = 0, right = nums.length - 1;

while (left < right) {
int sum = nums[left] + nums[right];
if (sum == target) {
return new int[]{left, right};
} else if (sum < target) {
left++;
} else {
right--;
}
}
return new int[]{-1, -1};
}
阅读更多

JWT 介绍

什么是 JWT?

JWT (JSON Web Token) 是目前最流行的跨域认证解决方案,是一种基于 Token 的认证授权机制。 从 JWT 的全称可以看出,JWT 本身也是 Token,一种规范化之后的 JSON 结构的 Token。

JWT 自身包含了身份验证所需要的所有信息,因此,我们的服务器不需要存储 Session 信息。这显然增加了系统的可用性和伸缩性,大大减轻了服务端的压力。

可以看出,JWT 更符合设计 RESTful API 时的「Stateless(无状态)」原则

阅读更多

关于Spring 与 Spring Boot 的一些图

Spring Framework 启动流程

1. 流程图

以下流程图展示了 Spring Framework 从创建 ApplicationContext 到完成初始化的关键步骤。

flowchart TD
    A[启动入口: main 方法] --> B[创建 AnnotationConfigApplicationContext]
阅读更多

Spring Framework 与 Spring Boot 启动对比

Spring Boot 和 Spring Framework 都是构建现代 Java 企业级应用程序的强大工具。Spring Boot 基于 Spring Framework 之上,旨在简化 Spring 应用的创建和配置过程。尽管两者在启动流程上存在许多相似之处,但 Spring Boot 引入了一些额外的机制和约定,以提高开发效率和应用的可扩展性。以下将详细对比两者的启动流程,强调它们的异同点,并结合源码角度进行说明。

目录

  1. 总体架构对比
阅读更多

Spring Boot 启动流程分析

Spring Boot 简化了基于 Spring 的应用程序的创建和部署过程,其启动流程涉及多个步骤和组件。为了详细理解 Spring Boot 的启动流程,我们可以从源码的角度进行分析。以下是 Spring Boot 启动过程的详细介绍,结合关键源码类和方法进行说明。

应用程序的入口点

通常,Spring Boot 应用程序的启动入口是一个带有 main 方法的类,该类使用 @SpringBootApplication 注解。例如:

1
2
3
4
5
6
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
阅读更多

Spring Framework 启动流程分析

Spring Framework 是一个功能强大且灵活的用于构建企业级 Java 应用程序的框架。理解 Spring Framework 的启动流程对于深入掌握其工作机制、调试应用程序以及进行高级定制非常重要。本文将详细介绍 Spring Framework 的启动流程,并结合关键源码类和方法进行说明。

应用程序的入口点

在 Spring Framework 中,应用程序的启动通常涉及创建和配置一个 ApplicationContext。常见的方式包括使用 ClassPathXmlApplicationContextAnnotationConfigApplicationContext 或通过 ContextLoader 在 Web 应用中加载上下文。

阅读更多

Spring Cloud 动态路由实现方案

目前Spring Cloud的路由网关方案主要是:Spring Cloud Gateway。默认便有自动更新路由的实现。通过 RouteRefreshListener 检测到更新条件发送 RefreshRoutesEvent 事件实现。更新条件:在服务启动时、新服务注册时、配置中心配置修改时、心跳更新时都会触发。

下面说下自己实现的方案,可以根据自身情况,自定义路由定义实体类。

使用Nacos配置监听方式

思路:监听配置变化,然后 RouteDefinitionWriter 更新路由规则。

阅读更多

面试知识点——共识算法

Paxos

Paxos最主要的贡献是解决了在不可靠通信和可能失效的节点中达成共识的问题。

1. Paxos算法的基本概念

Paxos算法由三种角色组成:

  1. 提议者(Proposer):提出提议(Proposal)。
  2. 接受者(Acceptor):投票决定是否接受一个提议。
阅读更多

Java 类加载器详解

开始介绍类加载器和双亲委派模型之前,简单回顾一下类加载过程。

  • 类加载过程:加载->连接->初始化
  • 连接过程又可分为三步:验证->准备->解析

类加载过程

加载是类加载过程的第一步,主要完成下面 3 件事情:

  1. 通过全类名获取定义此类的二进制字节流
  2. 将字节流所代表的静态存储结构转换为方法区的运行时数据结构
阅读更多

使用 Spring Boot + Javassist 实现运行时动态添加和删除 Controller

引言

在某些特殊场景下,我们可能需要在 Spring Boot 应用运行时动态地添加或删除 Controller。本文将详细介绍如何使用 Javassist 和 Spring Boot 的内部机制来实现这个功能。

技术栈

  • Spring Boot 2.7.0
  • Javassist 3.29.0-GA
  • Java 8+

Maven 依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.0</version>
</parent>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.29.0-GA</version>
</dependency>
</dependencies>
阅读更多