热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用TransmittableThreadLocal替换ThreadLocal重新打包spring

这里是以spring-core模块来说明方法,对于其他的例如spring-bean等模块也适用。1.下载springframework源码github地址ÿ

这里是以spring-core模块来说明方法,对于其他的例如spring-bean等模块也适用。




1. 下载 springframework 源码

github地址;
看一下自己使用的spring版本,需要注意应该是spring-corespring-bean这些spring模块的版本而不是springboot的版本,然后把springframework源码切换到对应的大版本分支上,例如我的是spring-core:5.3.10,所以我用springframework:5.3.x
如果大版本号不匹配,替换掉原版本后可能会引入其他问题。


2. 修改代码

我这里是为了跨线程池的线程共享事务,所以修改的是spring-core的源码,详见这里:解决@Transactional不能跨线程池共享事务的问题—使用TransmittableThreadLocal。
spring-core模块的build.gradle文件添加TransmittableThreadLocal依赖:

dependencies {api("com.alibaba:transmittable-thread-local:2.12.1")
}

这里需要注意的是要符合gradle的语法,gradle升级比较快,语法变动也比较大,不像maven比较稳定。springframework:5.3.x使用的是gradle:7.0,如果是springframework:4.3.x等早期版本,可能会跟上面写的不太一样。
找到NamedThreadLocalNamedInheritableThreadLocal两个类,这两个类都继承自ThreadLocal,修改为继承自TransmittableThreadLocal:

public class NamedThreadLocal extends TransmittableThreadLocal {}
public class NamedInheritableThreadLocal extends TransmittableThreadLocal {}

两个类的具体实现不需要修改。


3. 重新打包

在工程的build.gradle文件添加(版本号根据自己的修改):

allprojects {group = 'org.springframework'version = '5.3.11'
}

这样重新打包发布到本地仓库时,就会得到版本号为5.3.11的包(根据需要自己修改版本号)。
如果你本身会用gradle打包,就按照你自己的方法打包并发布到本地仓库就行;我这边使用的 idea 打包工具,在右侧边栏找到gradle,打开gradle -> spring -> spring-core -> tasks -> publishing -> publishToMavenLocal,如果是springframework:4.3.x,是gradle -> spring -> spring-core -> tasks -> other -> install,其他版本我没有尝试。
如果需要重新打包其他模块,选择对应模块的打包工具就行。
打包成功之后查看本地仓库就能看到新生成的的spring-core的jar包(本地仓库地址可以在File -> settings -> Build -> Build Tools -> Gradle -> Gradle user home看到)。


4. 其他工程引入刚才打好的包

使用这个包的其他工程需要在build.gradle文件加上:

repositories {mavenLocal()mavenCentral()
}

mavenLocal()代表优先使用本地仓库,我一开始忘了这一点,一直只有mavenCentral()配置,导致 gradle 直接去maven中央仓库拉取,怎么都获取不到自己打的包。 此时按正常方法在build.gradle文件中引入自己打的spring-core包即可。


 


推荐阅读
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 在macOS环境下使用Electron Builder进行应用打包时遇到签名验证失败的问题,具体表现为签名后spctl命令检测到应用程序未通过公证(Notarization)。本文将详细探讨该问题的原因及解决方案。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文探讨了 Spring Boot 应用程序在不同配置下支持的最大并发连接数,重点分析了内置服务器(如 Tomcat、Jetty 和 Undertow)的默认设置及其对性能的影响。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 本文介绍如何在Linux Mint系统上搭建Rust开发环境,包括安装IntelliJ IDEA、Rust工具链及必要的插件。通过详细步骤,帮助开发者快速上手。 ... [详细]
author-avatar
多多之爱
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有