ThreadLocal自定义线程工具类,最最简单的使用
-
基于ThreadLocal封装工具类,用于在线程内部的多个方法间传递数据,eg:登录的用户ID -
该工具类保证了唯一性之一:ThreadLocal唯一 -
另外一个唯一性:使用同一个线程,需要其他代码本身(Filter、Controller、Service、mapper等方法调用)来实现
- 注意:一个请求就是一个线程
@Configuration//配置类加载进Spring容器
public class ThreadLocalUtil {
private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();
/**
* 设置值
* @param 登录的用户id
*/
public static void setCurrentId(Long id) {
threadLocal.set(id);
}
/**
* 获取值
* @return 返回用户的登录ID
*/
public static Long getCurrentId() {
return threadLocal.get();
}
/**
* 删除值
*/
注意:该方法无法传入参数
public static void remove() {
threadLocal.remove();
};
}
mybatisplus 自动填充功能实现
eg:实体类需要实现自动填充的字段,什么字段需要自动填充,就在该字段上方加入注解:
@TableField(fill = FieldFill.INSERT)或者
@TableField(fill = FieldFill.INSERT_UPDATE)
@Component
public class MydateHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
/*
第一个参数是实体类中的创建时间属性,第二个是修改记录时间属性
-- 自动将用户id填充进线程工具类中
*/
metaObject.setValue("createTime",LocalDateTime.now());
metaObject.setValue("updateTime",LocalDateTime.now());
Long employeeId = ThreadLocalUtil.getCurrentId();
metaObject.setValue("createUser",用户ID);
metaObject.setValue("updateUser",用户ID);
}
@Override
public void updateFill(MetaObject metaObject) {
/*
实体类中修改时间的属性
*/
metaObject.setValue("updateTime",LocalDateTime.now());
Long employeeId = ThreadLocalUtil.getCurrentId();
metaObject.setValue("updateUser", 用户ID);
}
}