采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师好, RequestHolder获取当前用户可以在任意位置使用吗? 比如我想在日志工具类里使用. 日志工具类并未交给Spring管理. 或者说userHolder ThreadLocal 使用范围, 有什么上下文之类的吗? 我始终对这个RequestHolder不是很能理解
你好,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的理解。
祝你学习愉快~
感谢老师的耐心解答, 博客我也看了, 懂了一些. 您看我这么理解是否正确: 当一个请求到达服务器时开启一个线程, 如果没有手动开启一个新的线程, 那么后面关于这个请求处理都是在一个线程内, 所以即使DAO层可以直接从RequestHolder取当前用户. 如果理解正确的话, 我还有一个疑问请教下老师. 分布式系统中, 假设一个请求过来调用了多个soa处理, 每个soa都在另外一个独立的服务器上. 这种情况下, 咱们的RequestHolder还能在soa的实现层获取当前用户的值吗?因为我直观感觉这种情况应该不是在同一个线程内的.
所以即使DAO层也可以直接从RequestHolder取当前用户
其实在哪一层使用不是关键,关键在于是不是在相同的线程里面。 信息被封装在封闭的线程里,只有单独这个线程能取到。 另外,使用也要保证在进行add操作之后、remove操作之前
登录后可查看更多问答,登录/注册
源于企业真实Java项目,涉及大量高级技巧,覆盖权限管理开发技术
2.4k 6
2.1k 22
1.4k 20
1.3k 20
1.1k 18