ThreadLocal的使用

ThreadLocal(day02中)

在新增过程中,需要设置以下四个字段,在更新的过程中需要设置后两个字段,每次新增(新增员工,菜单等等)时就需要设置。而这些代码属于重复部分,可以拿出来,不用反复重写。在mybatisplus中提供了一种方法,公共字段自动填充功能

image-20220722124156125

元数据对象处理的代码为:

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
/**
* 自定义元数据对象处理器
*/
@Component
public class MyMateObjectandler implements MetaObjectHandler {

/**
* 新增时,自动填充
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {

//设置创建时间,在实体类中可以看到时间的类型为:LocalDateTime
metaObject.setValue("createTime", LocalDateTime.now());

//设置更新时间
metaObject.setValue("updateTime", LocalDateTime.now());

//设置创建者
metaObject.setValue("createUser", new Long(1));
//设置更新者
metaObject.setValue("updateUser", new Long(1));

}

/**
* 更新时,自动填充
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
//设置更新时间
metaObject.setValue("updateTime", LocalDateTime.now());
//设置更新者
metaObject.setValue("updateUser", new Long(1));

}
}

以上代码有问题,就是修改用户的id是写死的,因为不能定义HttpServletRequest,因此这里使用ThreadLocal的方法解决

因为每发送一次http请求,调用方法的线程都是同一个线程,

使用ThreadLocal:

ThreadLocal 是 Java 里一种特殊变量,它是一个线程级别变量,每个线程都有一个 ThreadLocal 就是每个线程都拥有了自己独立的一个变量,竞态条件被彻底消除了,在并发模式下是绝对安全的变量。

可以通过 ThreadLocal value = new ThreadLocal(); 来使用。

会自动在每一个线程上创建一个 T 的副本,副本之间彼此独立,互不影响,可以用 ThreadLocal 存储一些参数,以便在线程中多个方法中使用,用以代替方法传参的做法。

image-20220722135352428


ThreadLocal的使用
http://example.com/2022/07/22/方法/
作者
zlw
发布于
2022年7月22日
许可协议