关于RequestHolder的疑问

来源:8-11 ThreadLocal,LoginFilter实现登录请求的拦截

banjuer

2018-05-26

老师好, RequestHolder获取当前用户可以在任意位置使用吗? 比如我想在日志工具类里使用. 日志工具类并未交给Spring管理. 或者说userHolder ThreadLocal 使用范围, 有什么上下文之类的吗? 我始终对这个RequestHolder不是很能理解

写回答

1回答

Jimin

2018-05-26

你好,RequestHolder核心是使用了解决并发类问题的一个重点手段:线程封闭。不知道你是否学过我的那门并发课程,这里我具体介绍一下。

RequestHolder这个类核心是借助于ThreadLocal来实现的,ThreadLocal可以保证在当前线程设置的信息只在当前线程中可以获得,其他线程获取的是其他线程自己设置过的信息。结合LoginFilter,可以理解为,一个请求在进来(服务器开启了一个新的线程)时,我们把用户信息写到RequestHolder里了,这样在接口处理时(这个过程,如果没自己开启新thread就都是同一个线程),随时可以从里面获取这个接口之前放入的用户信息。这样封装的一个好处是,你可以在这个接口处理过程的任何时候,获取对应的登录用户信息,而不需要考虑是否是spring管理的bean,直接从一个静态方法里获取。

因此呢,日志工具类里是可以使用RequestHolder的,如果我没理解错的话,他应该也是在一个线程处理过程中使用的,这是RequestHolder可以正常的获取到登录的用户信息。

但是呢,我不会在日志工具类里直接使用RequestHolder类,我自己的话会选择先从RequestHolder里取出user甚至是user里的userName,然后当做一个参数传给日志工具类的相关方法。我的想法是,不希望一个工具类强依赖一个业务逻辑处理的RequestHolder。我理解的工具类尽可能是封装一次后,在多个项目里都能使用,而不需要改逻辑实现。

这个问题最后,推荐一篇ThreadLocal的文章,http://www.importnew.com/17849.html ,你可以看看,加深对ThreadLocal的理解。

祝你学习愉快~

2
5
Jimin
回复
banjuer
是的。
2018-05-29
共5条回复

Java开发企业级权限管理系统

源于企业真实Java项目,涉及大量高级技巧,覆盖权限管理开发技术

2226 学习 · 1334 问题

查看课程