请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于RequestHolder的疑问

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

正在回答

1回答

Jimin 2018-05-26 09:22:25

你好,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 回复 有任何疑惑可以回复我~
  • 提问者 banjuer #1
    感谢老师的耐心解答, 博客我也看了, 懂了一些. 您看我这么理解是否正确: 当一个请求到达服务器时开启一个线程, 如果没有手动开启一个新的线程, 那么后面关于这个请求处理都是在一个线程内, 所以即使DAO层可以直接从RequestHolder取当前用户. 如果理解正确的话, 我还有一个疑问请教下老师. 
    分布式系统中, 假设一个请求过来调用了多个soa处理, 每个soa都在另外一个独立的服务器上. 这种情况下, 咱们的RequestHolder还能在soa的实现层获取当前用户的值吗?因为我直观感觉这种情况应该不是在同一个线程内的.
    回复 有任何疑惑可以回复我~ 2018-05-26 18:46:26
  • 提问者 banjuer #2
    所以即使DAO层也可以直接从RequestHolder取当前用户
    回复 有任何疑惑可以回复我~ 2018-05-26 18:47:20
  • Jimin 回复 提问者 banjuer #3
    其实在哪一层使用不是关键,关键在于是不是在相同的线程里面。
    信息被封装在封闭的线程里,只有单独这个线程能取到。
    另外,使用也要保证在进行add操作之后、remove操作之前
    回复 有任何疑惑可以回复我~ 2018-05-27 18:34:58
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信