当前位置: 首页 > news >正文

基于 ThreadContext 封装多个“业务上下文类”以实现可复用、易拓展

前言

本文针对已经了解了ThreadLocal的读者 本文将会运用threadLocal给出完整的需要在一个上下文中传递全局参数 如userInfo 信息的解决方案

基本思路:

1、定义ThreadContext 作为底层“线程隔离存储容器”
2、基于ThreadContext 衍生出多个特定场景的业务封装类(Context 工具类)
3、新增一个业务上下文,只需加一个封装类,不改底层逻辑

ThreadContext

import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;public final class ThreadContext {private static final ThreadLocal<Map<String, Object>> THREAD_LOCAL = new ThreadLocal();public ThreadContext() {}public static <T> T getAttribute(String key) {return getNotInheritableAttributes().get(key);}private static Map<String, Object> getNotInheritableAttributes() {Map<String, Object> attributes = (Map)THREAD_LOCAL.get();if (attributes == null) {attributes = new ConcurrentHashMap(32);THREAD_LOCAL.set(attributes);}return (Map)attributes;}public static void setNotInheritableAttribute(String key, Object value) {Assert.notBlank(key, "ThreadLocal的key不能为空!", new Object[0]);Assert.notNull(value, "ThreadLocal的value不能为空!", new Object[0]);getNotInheritableAttributes().put(key, value);}public static void setNotInheritableAttributes(Map<String, ?> attributes) {Assert.notEmpty(attributes, "ThreadLocal的参数不能为空!", new Object[0]);getNotInheritableAttributes().putAll(attributes);}public static void removeAttribute(String key) {Assert.notBlank(key, "key不能为空!", new Object[0]);getNotInheritableAttributes().remove(key);}public static void clearAttributes() {THREAD_LOCAL.remove();}
}

然后就可以基于ThreadContext 根据不同的业务衍生不同的Context 工具类

UserContext

public class UserContext {public static void setUserInfo(User user) {ThreadContext.setNotInheritableAttribute("USER_INFO", user);}public static User getUserInfo() {User user = (User)ThreadContext.getAttribute("USER_INFO");if (user == null) {throw new IllegalArgumentException("无法获取登录用户信息!");} else {return user;}}public static boolean hasUserInfo() {return ThreadContext.containsAttribute("USER_INFO");}public static void clear() {ThreadContext.removeAttribute("USER_INFO");}
}

任意类型的XXContext


public class BusinessContext {private static final String KEY = "business";public static void setBusiness(String info) {ThreadContext.setNotInheritableAttribute(KEY, info);}public static String getBusiness() {return (String)ThreadContext.getAttribute(KEY);}public static void clear() {ThreadContext.removeAttribute(KEY);}
}

总结

ThreadContext 管理存取逻辑

UserContext / BusinessContext 等专注业务字段

可复用、易拓展

新增一个业务上下文,只需加一个封装类,不改底层逻辑。

相关文章:

  • PH热榜 | 2025-06-03
  • 从0到1认识EFK
  • MATLAB实战:四旋翼姿态控制仿真方案
  • ARP (Address Resolution Protocol,地址解析协议)将IP地址解析为物理地址(MAC地址)
  • 痉挛性斜颈日常养护小贴士
  • 如何构建自适应架构的镜像
  • 手机邮箱APP操作
  • Diffusion Models: A Comprehensive Survey of Methods and Applications
  • JWTの求生记录
  • 学习STC51单片机26(芯片为STC89C52RCRC)
  • Freemarker快速入门
  • js实现可折叠的列表或菜单
  • 【亲测有效 | Cursor Pro每月500次快速请求扩5倍】(Windows版)Cursor中集成interactive-feedback-mcp
  • Java:跨越时代的编程语言,持续引领技术革新
  • 虚拟现实教育终端技术方案——基于EFISH-SCB-RK3588的全场景国产化替代
  • 软件评测师 综合测试 真题笔记
  • 【数据中心设计】
  • 《Effective Python》第六章 推导式和生成器——总结(基于智能物流仓储监控系统的数据处理)
  • 原始数据去哪找?分享15个免费官方网站
  • IP话机和APP拨打电话的区别
  • 英铭广州网站建设/网络平台推广方案
  • dw2019怎么做网站/网络营销五个特点
  • 政府网站首页模板/给你一个网站怎么优化
  • 公司做网站的费属于广告费么/智能建站系统
  • 邦拓网站建设/爱站小工具圣经
  • 教育网站 怎么做吸引人/b2b平台是什么意思啊