线程变量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();

 

posted @ 2016-10-06 17:50  李昭文-Java成长之路  阅读(3405)  评论(0编辑  收藏  举报