当前位置:网站首页>Web开发小妙招:巧用ThreadLocal规避层层传值
Web开发小妙招:巧用ThreadLocal规避层层传值
2022-07-06 12:42:00 【51CTO】
摘要:我们可以在处理每次请求的过程中,无需从Controller以及Service中的方法层层传值,只需要直接通过该局部变量取值即可。
本文分享自华为云社区《 拦截器中巧用ThreadLocal规避层层传值》,作者:KevinQ。
Web开发中的一点麻烦事
最近,准确地说,是一直都有的一点麻烦事:函数层层传递。什么意思呢?比如说有个很常见的需求描述是:记录用户的某次操作明细。
以在Java的开源框架jfinal中,操作添加一个用户的接口为例,有:
为了记录用户添加的具体操作内容以及信息错误,这个记录用户操作的记录可能需要穿透好层方法。
举得这个例子或许不是很恰当,但是相信大家可以理解这个麻烦点在哪里。
函数调用链中的每个方法并不是需要这个参数,而可能仅仅是为了向下个被调用的函数传递这个参数。
那么是否有方法帮助我们来不需要这样逐层传递,从而获取接口请求参数的方法呢。
思考
这有点类似与一个全局变量,但是这个变量对每次请求来说是变化的,那么是否有一种方式能够让我们来保存这样一种:针对每次请求的全局变量呢?
在最近学习Shiro的过程中,以及学习若依开源框架的过程中,我们发现其均使用到了一个强大的Java类:ThreadLocal。
shiro使用ThreadLocal是用来保存当前登录对象,若依框架中,其中所使用的分页插件PageUtil使用ThreadLocal保存请求参数中的pageNum与pageSize等分页参数。因此我们是不是也可以使用ThreadLocal来达到同样的目的。
在拦截器中使用ThreadLocal暂存请求参数
为此,我们来尝试一下,通过ThreadLocal保存请求参数,通过拦截器我们可以拦截每次请求,如下是实现方式:
我们通过ThreadLocal将整个请求暂存起来,当然,为了节约内存,也可以只保存使用频次高的通用参数,比如当前登录人的信息等等。
使用参数
使用时,只需要我们通过这个线程局部变量取值即可:
如此,我们便可以在处理每次请求的过程中,无需从Controller以及Service中的方法层层传值,只需要直接通过该局部变量取值即可。
边栏推荐
- 8086 instruction code summary (table)
- [200 opencv routines] 220 Mosaic the image
- 【每周一坑】输出三角形
- 【微信小程序】运行机制和更新机制
- Redis insert data garbled solution
- Summary of different configurations of PHP Xdebug 3 and xdebug2
- How to upgrade high value-added links in the textile and clothing industry? APS to help
- Minimum cut edge set of undirected graph
- 2110 summary of knowledge points and common problems in redis class
- [diy] self designed Microsoft makecode arcade, official open source software and hardware
猜你喜欢
[weekly pit] information encryption + [answer] positive integer factorization prime factor
Number of schemes from the upper left corner to the lower right corner of the chessboard (2)
Mécanisme de fonctionnement et de mise à jour de [Widget Wechat]
Build your own application based on Google's open source tensorflow object detection API video object recognition system (IV)
Pinduoduo lost the lawsuit, and the case of bargain price difference of 0.9% was sentenced; Wechat internal test, the same mobile phone number can register two account functions; 2022 fields Awards an
01 基础入门-概念名词
[diy] how to make a personalized radio
Statistical inference: maximum likelihood estimation, Bayesian estimation and variance deviation decomposition
2022 Guangdong Provincial Safety Officer C certificate third batch (full-time safety production management personnel) simulation examination and Guangdong Provincial Safety Officer C certificate third
设计你的安全架构OKR
随机推荐
Maximum likelihood estimation and cross entropy loss
Why do novices often fail to answer questions in the programming community, and even get ridiculed?
逻辑是个好东西
性能测试过程和计划
Recyclerview not call any Adapter method :onCreateViewHolder,onBindViewHolder,
SQL injection 2
Pinduoduo lost the lawsuit, and the case of bargain price difference of 0.9% was sentenced; Wechat internal test, the same mobile phone number can register two account functions; 2022 fields Awards an
Redis insert data garbled solution
01 基础入门-概念名词
电子游戏的核心原理
7、数据权限注解
##无yum源安装spug监控
Notes on beagleboneblack
C language operators
【微信小程序】運行機制和更新機制
Infrared thermometer based on STM32 single chip microcomputer (with face detection)
Comment faire une radio personnalisée
[DIY]如何制作一款個性的收音機
C language games - three chess
JS implementation force deduction 71 question simplified path