ThreadLocal并不难理解,我总结的最简单的理解就是:
ThreadLocal像其它变量一样(局部、全局、静态)也是一种变量类型,只是他是线程变量,更直白的说他是一种变量作用域,即他的作用域是当前线程(比如用户的一个请求算一个线程),ThreadLocal用于在一个线程间共享。
ThreadLocal的set(String,Object)方法就是设置这个变量的名称、同时给这个变量赋值、当然同时也给予了这个变量的类型。
@SuppressWarnings("unchecked") public class UserSession { private static final ThreadLocal SESSION_MAP = new ThreadLocal(); protected UserSession() { } public static Object get(String attribute) { Map map = (Map) SESSION_MAP.get(); return map.get(attribute); } public static <T> T get(String attribute, Class<T> clazz) { return (T) get(attribute); } public static void set(String attribute, Object value) { Map map = (Map) SESSION_MAP.get(); if (map == null) { map = new HashMap(); SESSION_MAP.set(map); } map.put(attribute, value); } }
接下来要做的就是在请求过滤器中:
UserSession.set("user",从session中取出用户信息)
然后我们就能在任意的一层service或者dao里:
UserSession.get("user") 获取当前线程的user信息了
好处:避免了跨层之间的参数传递,实现了层与层之间的松耦合。