SpringBoot整合SpringSecurity

https://www.kuangstudy.com/bbs/1369251751735095298

Spring Security课程介绍

Read more »

TDD测试驱动开发

用户提供的信息:

  • 用户昵称(长度最长为20个字节,即最长20个英文单词,10个汉字)(必须传入)

  • 用户性别(1代表男,2代表女)(必须传入)

  • 用户出生日期(格式为YYYY-MM-DD)(必须传入)

  • 用户简介(长度最长为40个字节,即最长40个英文单词,20个汉字)(必须传入)

Read more »

提高代码鲁棒性——(1)

  • 需要 Map 的主键和取值时,应该迭代 entrySet()

当循环中只需要 Map 的主键时,迭代 keySet() 是正确的。但是,当需要主键和取值时,迭代 entrySet() 才是更高效的做法,比先迭代 keySet() 后再去 get 取值性能更佳。

Read more »

代理模式是一种经典的设计模式,代理的意义在于生成代理对象,在服务提供方和使用方之间充当一个媒介,控制真实对象的访问。

代理分为静态代理和动态代理两种。

静态代理需要通过手动或工具生成代理类并编译,代理类和委托类的关系在编译期就已经确定。动态代理允许开发人员在运行时动态的创建出代理类及其对象。

Read more »

异步执行的代码

1
new Thread(r).start();

统一的工具类,定一个接口来实现。

Read more »

基于 ReentrantLock实现一个锁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package aqsLock;

import java.util.concurrent.locks.AbstractQueuedSynchronizer;


/**
* @Author: Kayleh
* @Date: 2021/4/20 0:57
*/
public class aqsLock
{
public void lock()
{
sync.acquire(1);
}

public void unlock()
{
sync.release(1);
}

private final Sync sync = new Sync();

public static class Sync extends AbstractQueuedSynchronizer
{
@Override
protected boolean tryAcquire(int arg)
{
// CAS 方式尝试获取锁,成功返回true,失败返回false
if (compareAndSetState(0, 1))
return true;
return false;
}

@Override
protected boolean tryRelease(int arg)
{
// 释放锁
setState(0);
return true;
}
}
}

基本功能实现,测试:

Read more »

CAS(Compare And Swap)原理分析

字面意思是比较和交换,先看看下面场景(A 和 B 线程同时执行下面的代码):

1
2
int i = 10;	//代码1
i = 10; //代码2
Read more »

深入浅出Map

Map是java里边是一个接口,常见的实现类有HashMap、LinkedHashMap、TreeMap和ConcurrentHashMap

HashMap底层数据结构是数组+链表/红黑树

Read more »

Spring是怎么解决循环依赖的?

首先站在Spring整个Framework体系而言的话,Spring的Bean是由一个BeanDefinition来的,就是在Spring当中,有一个叫建模的类BeanDefinition,Spring的Bean有一系列比较复杂的生命周期:

  • 首先,Spring容器启动。

  • spring进行扫描

  • 反射后封装成beanDefinition对象,放入beanDefinitionMap

  • 遍历map

  • 验证(是否单例、是否延迟加载、是否抽象)

  • 推断构造方法( 把当前这个Spring Bean所代表的类当中的构造方法得到一个最佳的一个构造方法 )

  • 准备开始进行实例

  • 去单例池中查,没有——》去二级缓存中找,没有提前暴露——》生成一个objectFactory对象暴露到二级缓存中——》属性注入,发现依赖Y——》此时Y开始它的生命周期直到属性注入,发现依赖X->X又走一遍生命周期,当走到去二级缓存中找的时候找到了->往Y中注入X的objectFactory对象->完成循环依赖。

Read more »

公司产品出现瓶颈?

我们公司项目刚刚上线的时候,并发量小,用户使用的少,所以在低并发的情况下,一个jar包启动应用就够了,然后内部tomcat返回内容给用户。
img
但是慢慢的,使用我们平台的用户越来越多了,并发量慢慢增大了,这时候一台服务器满足不了我们的需求了。
img
于是我们横向扩展,又增加了服务器。这个时候几个项目启动在不同的服务器上,用户要访问,就需要增加一个代理服务器了,通过代理服务器来帮我们转发和处理请求。
img
我们希望这个代理服务器可以帮助我们接收用户的请求,然后将用户的请求按照规则帮我们转发到不同的服务器节点之上。这个过程用户是无感知的,用户并不知道是哪个服务器返回的结果,我们还希望他可以按照服务器的性能提供不同的权重选择。保证最佳体验!所以我们使用了Nginx。

什么是Nginx?

Read more »
0%