SpringBoot线程上下文传递数据

2023-11-02

1、底层实现

使用ThreadLocal,使用方法

public T get()
 
public void set(T value)
 
public void remove()

2、自定义上下文

package com.ybw.context.config;


import com.ybw.context.dto.TenantDTO;

/**
 * @author ybw
 * @version V1.0
 * @className TenantContext
 * @date 2022/9/30
 **/
public class TenantContext {

    private static final ThreadLocal<TenantDTO> context = new ThreadLocal<>();

    /**
     * 构造方法私有化
     *
     * @methodName: TenantContext
     * @return:
     * @author: ybw
     * @date: 2022/9/30
     **/
    private TenantContext() {

    }


    /**
     * 存放租户信息
     *
     * @param tenantDTO
     * @methodName: set
     * @return: void
     * @author: ybw
     * @date: 2022/9/30
     **/
    public static void set(TenantDTO tenantDTO) {
        context.set(tenantDTO);
    }

    /**
     * 获取组合信息
     *
     * @methodName: get
     * @return: com.ybw.mybatis.multi.tenant.dto.TenantDTO
     * @author: ybw
     * @date: 2022/9/30
     **/
    public static TenantDTO get() {
        return context.get();
    }

    /**
     * 清除当前线程内引用,防止内存泄漏
     *
     * @methodName: remove
     * @return: void
     * @author: ybw
     * @date: 2022/9/30
     **/
    public static void remove() {
        context.remove();
    }
}

3、定义dto

package com.ybw.context.dto;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author ybw
 * @version V1.0
 * @className TenantDTO
 * @date 2022/9/30
 **/
@NoArgsConstructor
@AllArgsConstructor
@Data
public class TenantDTO {
    /**
     * 组合层级
     *
     * @author: ybw
     * @date: 2022/9/30
     **/
    private Integer level;
    /**
     * 租户id
     *
     * @author: ybw
     * @date: 2022/9/30
     **/
    private Long tenantId;
}

4、调用

package com.ybw.context.service;

/**
 * @className TenantService
 * @author ybw
 * @date 2022/10/1 
 * @version V1.0
 **/
public interface TenantService {

    /**
     *
     * @methodName: print
     * @return: void
     * @author: ybw
     * @date: 2022/10/1
     **/
    void print();
}
package com.ybw.context.service.impl;

import com.alibaba.fastjson2.JSON;
import com.ybw.context.config.TenantContext;
import com.ybw.context.dto.TenantDTO;
import com.ybw.context.service.TenantService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Service
@Slf4j
public class TenantServiceImpl implements TenantService {

    @Override
    public void print() {
        TenantDTO tenantDTO = TenantContext.get();
        TenantContext.remove();
        if (tenantDTO == null) {
            return;
        }
        log.info("tenantDTO:{}", JSON.toJSONString(tenantDTO));
    }
}

5、测试

package com.ybw.context.service;

import com.ybw.context.config.TenantContext;
import com.ybw.context.dto.TenantDTO;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
@Slf4j
class TenantServiceTest {

    @Resource
    private TenantService tenantService;

    @Test
    void print() {
        TenantContext.set(new TenantDTO(1,12L));
        tenantService.print();
    }
}

输出结果

[INFO ] 2022-10-01 22:45:13.207 [main] c.y.c.service.TenantServiceImpl - tenantDTO:{"level":1,"tenantId":12}

6、示例代码

share: 分享仓库 - Gitee.com

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot线程上下文传递数据 的相关文章

  • 如何打印整个字符串池?

    我想打印包含文字的整个字符串池String使用添加的对象intern 就在垃圾收集之前 JDK有没有隐式的方法来进行这样的操作 我们如何检查字符串池 EDIT The comment suggests that there may be a
  • 如何从另一个xml文件动态更新xml文件?

    我想从另一个 xml 文件更新 xml 文件 我使用了一个 xml 文件 如下所示 one xml
  • 无法加载 jar 文件的主类

    我使用 Eclipse IDE 开发了一个应用程序 创建应用程序后 我以 jar 格式导出项目 当我尝试运行此 jar 文件时 出现错误 无法加载主类 请帮忙 当您将项目导出为 jar 时 请参阅此所以问题 https stackoverf
  • 通过 InjectMocks Spy 注入对象

    我需要对一个类运行一系列单元测试 该类具有 Autowired Logger 实现 实现的基本思想是 Mock Logger logger InjectMocks TestedClass tested 但我想保存日志输出功能 Mockito
  • 如何对 IntStream 进行逆序排序

    我正在使用 txt 文件读取数字BufferedReader 我想颠倒该流中元素的顺序 以便在收集它们时 它们将从最高到最低排列 我不想在构建数组后进行排序 因为我不知道其中可能有多少元素 我只需要最高的 N 个元素 in new Buff
  • 使用 Spring 时实例化对象,用于测试与生产

    使用 Spring 时 应该使用 Spring 配置 xml 来实例化生产对象 并在测试时直接实例化对象 这样的理解是否正确 Eg MyMain java package org world hello import org springf
  • Java 重写 hashCode() 得到 StackOverflowError

    所以我不太熟悉重写 hashCode 并且我似乎在 hashCode 方法中以某种方式进行了一些无限递归 这是我的场景 我有一个 DuplicateCache 类 它是一个缓存对象 用于检查系统中的重复对象 我有一个静态内部类 Duplic
  • Java:从元素创建 DOM 元素,而不是文档

    如您所知 在 Java 中创建 Dom 元素的正确方法是执行以下操作 import org w3c dom Document import org w3c dom Element Document d Element e e d creat
  • PropertySources 中各种源的优先级

    Spring引入了新的注释 PropertySources对于所有标记为的类 Configuration since 4 0 需要不同的 PropertySource作为论证 PropertySources PropertySource c
  • 如何将 Spotlight for Help 插入本地化的 macOS 应用程序?

    我正在 macOS 上使用 Swing GUI 框架实现 Java 应用程序 当使用system外观和感觉以及screen菜单栏 Swing 自动插入一个搜索栏 called 聚光灯寻求帮助 https developer apple co
  • spring - 强制 @Autowired 字段的 cglib 代理

    我有混合堆栈 EJB 和 Spring 为了将 Spring 自动装配到 EJB 我使用SpringBeanAutowiringInterceptor 不确定这是否会影响我遇到的问题 在尝试通过以下方式自动装配 bean 时 Scope p
  • 如何在 Spring MongoDB 聚合上投影 DBRef?

    我在 MongoDB shell 中完成了以下聚合 以获取每个用户每种类型的警报数量 db getCollection alerts aggregate unwind son group id son son level level cou
  • Install4j:如何在安装结束时执行命令行 java -jar filename.jar

    在 Intall4j 中 在安装结束时 我只想通过执行如下命令行来初始化某些内容 java jar filename jar 我怎样才能归档这个任务install4j Thanks 将 运行可执行文件或批处理文件 操作添加到 安装屏幕 并设
  • 如何使用 Mockito 和 Junit 模拟 ZonedDateTime

    我需要模拟一个ZonedDateTime ofInstant 方法 我知道SO中有很多建议 但对于我的具体问题 到目前为止我还没有找到任何简单的解决办法 这是我的代码 public ZonedDateTime myMethodToTest
  • 在 AKKA 中,对主管调用 shutdown 是否会停止其监督的所有参与者?

    假设我有一位主管连接了 2 位演员 当我的应用程序关闭时 我想优雅地关闭这些参与者 调用supervisor shutdown 是否会停止所有参与者 还是我仍然需要手动停止我的参与者 gracias 阻止主管 https github co
  • OpenJDK 版本控制

    上下文 我想确保我们系统上安装的 Java 不受 CVE 2022 21449 的影响 java version 给出 openjdk version 11 0 7 2020 04 14 LTS OpenJDK Runtime Enviro
  • 如何为 Jackson 编写一个包罗万象的(反)序列化器

    当您提前知道类型时 编写自定义序列化器非常容易 例如 MyType一个人可以写一个MyTypeSerializer extends StdSerializer
  • 从 Stax XMLStreamReader 读取以解组部分

    我正在使用 Stax 游标 API 从大型 xml 文件中提取数据 当前 我转到特殊标签的开头并使用 JAXB 解组该标签 这对于格式良好的 xml 文件效果很好 但不久前我有一个文档 其中数十万个标签中有一个未关闭 JAXB 使用 XML
  • 我想要一个 Java 阿拉伯语词干分析器

    我正在寻找阿拉伯语的 Java 词干分析器 我找到了一个名为 AraMorph 的库 但它的输出是无法控制的 并且它会形成不需要的单词 还有其他阿拉伯语词干分析器吗 这是新的阿拉伯语词干分析器 Assem 的阿拉伯语轻词干分析器 http
  • Path2D 上的鼠标指针检测

    我构建了一个Path2D http docs oracle com javase 7 docs api java awt geom Path2D html表示由直线组成的未闭合形状 我希望能够检测何时单击鼠标并且鼠标指针靠近路径 在几个像素

随机推荐

  • Linux nohup、&、 2>&1是什么?

    基本含义 dev null 表示空设备文件 0 表示stdin标准输入 1 表示stdout标准输出 2 表示stderr标准错误 gt file 表示将标准输出输出到file中 也就相当于 1 gt file 2 gt error 表示将
  • JVisualVM初步使用

    JVisualVM初步使用 1 前言 jvm调优工具有常见的为Jconsole jProfile VisualVM Jconsole 为jdk自带 功能简单 但是可以在系统有一定负荷的情况下使用 对垃圾回收算法有很详细的跟踪 JProfil
  • 学习HTML的知识点总结

    一 网页 1 什么是网页 网站是指在因特网上根据一定规律 使用HTML等制作用于展示特定内容的网页集合 网页是网站中的一 页 通常是HTML格式的文件 他要通过浏览器来阅读 网页是构成网站的基本元素 它通常由图片 链接 文字 声音 视频等元
  • 【大模型】更强的 LLaMA2 来了,开源可商用、与 ChatGPT 齐平

    大模型 可商用且更强的 LLaMA2 来了 LLaMA2 简介 论文 GitHub huggingface 模型列表 训练数据 训练信息 模型信息 许可证 参考 LLaMA2 简介 2023年7月19日 Meta 发布开源可商用模型 Lla
  • 合并有序数组

    合并两个有序数组 描述 给你两个有序整数数组 nums1 和 nums2 请你将 nums2 合并到 nums1 中 使 num1 成为一个有序数组 说明 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 你可以假设 num
  • Pytest+selenium+allure+Jenkins自动化测试框架搭建及使用

    一 环境搭建 1 Python下载及安装 Python可应用于多平台包括windows Linux 和 Mac OS X 本文主要介绍windows环境下 你可以通过终端窗口输入 python 命令来查看本地是否已经安装Python以及Py
  • 软件测试22种测试方法与详解

    黑盒测试 不基于内部设计和代码的任何知识 而是基于需求和功能性 白盒测试 基于一个应用代码的内部逻辑知识 测试是基于覆盖全部代码 分支 路径 条件 单元测试 最微小规模的测试 以测试某个功能或代码块 典型地由程序员而非测试员来做 因为它需要
  • 用js制作一个视觉差背景

    我在网上冲浪的时候看到了一个文字和背景下滑速度不一致的情况 这看起来背景会有一种3d的感觉 于是研究了一下 首先先写出大概的html和css div class box div class bg div h2 我是一个文字 h2 p 我是一
  • 算法实验题1

    第一题 由1 3 4 5 7 8这6个数字组成六位数中 能被11整除的最大的数是多少 解答 可以使用暴力枚举法 将1 3 4 5 7 8的所有排列组合情况求出来 判断它们是否能被11整除 然后取其中能被11整除的最大值 但是这个方法的时间复
  • 蓝桥杯 第6天 动态规划(4)

    目录 1 121 买卖股票的最佳时机 力扣 LeetCode leetcode cn com 1 暴力解法 2 动态规划 2 122 买卖股票的最佳时机 II 力扣 LeetCode leetcode cn com 3 123 买卖股票的最
  • uni-app 页面样式

    页面样式与布局 尺寸单位 uni app 支持的通用 css 单位包括 px rpx px 即屏幕像素 rpx 即响应式px 一种根据屏幕宽度自适应的动态单位 以750宽的屏幕为基准 750rpx恰好为屏幕宽度 屏幕变宽 rpx 实际显示效
  • C++整数转成二进制方法总结

    经常遇到要用到二进制的情况 这里我就记录下 1 逐次经典位操作 返回一个含有二进制数的vector include
  • 【深度学习之图像理解】图像分类、物体检测、物体分割、实例分割、语义分割的区别

    Directions in the CV 物体分割 Object segment 属于图像理解范畴 那什么是图像理解 Image Understanding IU 领域包含众多sub domains 如图像分类 物体检测 物体分割 实例分割
  • 前端zip.js实现加密打包上传文件

    背景 一方面 部分系统对文件的私密性和安全性要求较高 实现前端加密打包 服务端不存储密码 下载时手动输入密钥并解压文件 另一方面 传输压缩包到客户端 节约了带宽 节约了传输时间 使用的库 zip js Support of the Zip6
  • List写入Excel,poi操作

    前言 公司最近需要将所有的报表导出集中到报表中心系统中 需要做一个通用的Excel工具类 让各个业务系统简单高效的生成Excel报表 由于原先各个业务系统生成报表方式都不一样 有的地方还直接使用了CSV 因此需要统一生成Excel 本来想用
  • Android Studio 可以正常编译运行 但是代码爆红

    这段时间毕设选题 选了一个自己曾经做过的题目 因为之前是用Android Studio2 3 3写的 现在导入Android Studio 3 2 1 代码报错 但是能正常编译运行 很是奇怪 主要报错原因是 找不到有些类 之前用Androi
  • zookeeper(二)——2PC理论、zookeeper集群、ZAB 协议

    一 关于 2PC 提交 Two Phase Commitment Protocol 当一个事务操作需要跨越多个分布式节点的时候 为了保持事务处理的 ACID特性 就需要引入一个 协调者 TM 来统一调度所有分布式节点的执行逻辑 这些被调度的
  • CTFshow php特性 web111

    目录 源码 思路 题解 总结 源码
  • adworld-crypto-banana_princess

    拿到了一个打不开的pdf文件 用hex editor打开一下看看 再看一下正常的pdf文件 猜测是用了rot13映射了一下字母字符 解密脚本 def load data filename content with open filename
  • SpringBoot线程上下文传递数据

    1 底层实现 使用ThreadLocal 使用方法 public T get public void set T value public void remove 2 自定义上下文 package com ybw context confi