线程变量ThreadLocal的使用
Posted 人在江湖飘AOE
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程变量ThreadLocal的使用相关的知识,希望对你有一定的参考价值。
我们有时候会通过token进行多次查询(猪:token是redis中的key),比如:
一次是在登录拦截器中,一次是在controller的业务中查询,这样存在性能和资源的浪费问题!!!
那么如何将拦截器中的数据传递到Controller中呢?
有两种方案:
1,将User对象放置到request对象中
2,使用ThreadLocal线程变量实现(在进入tomcat和产生响应前,对象都处于同一个线程中)
实现:
1,定义一个ThreadLocal相关的类
public class UserThreadLocal {
private static ThreadLocal<User> USER_LOCAL = new ThreadLocal<>();
//对外提供set和get方法
public static void setUser(User user){
USER_LOCAL.set(user);
}
public static User getUser(){
return USER_LOCAL.get();
}
}
2,在登陆拦截器中将User对象放置到ThreadLocal中
//查询到用户,将用户放入到ThreadLocal中
UserThreadLocal.setUser(user);
3,在Service中可以通过ThreadLocal获取User
//从ThreadLocal线程变量中获取User对象
User user = UserThreadLocal.getUser();
以上是关于线程变量ThreadLocal的使用的主要内容,如果未能解决你的问题,请参考以下文章
Java中线程局部变量ThreadLocal使用教程及源码分析