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

如何自定义一个Spring Boot Starter

如何自定义一个 Spring Boot Starter从零封装一个自己的自动配置本文基于 Spring Boot 2.7 / 3.x核心原理通用一、从一个真实场景说起最近咱们团队在做内部工具链建设好几个项目都要集成统一的日志追踪功能——每个请求进来自动在 MDC 里塞一个traceId然后打印到日志里。我一开始的做法很原始每个项目 copy 一份TraceFilterTraceInterceptor再 copy 一份配置类。 copy 到第三个项目的时候我忍不住了“这玩意儿能不能像spring-boot-starter-web一样加个依赖就自动生效”能。这就是Spring Boot Starter要干的事。说白了Starter 就是 Spring Boot 的**即插即用插件机制**。今天咱们就从一个具体需求出发手把手封装一个自己的 Starter。二、Starter 到底是什么先搞清楚原理2.1 一句话解释Starter 本质上是一个普通的 Maven/Gradle 模块核心就做两件事引入你需要的依赖比如你的工具类、第三方 SDK自动配置好这些组件通过Configuration 条件注解用户只需要在pom.xml里加一行dependencygroupIdcom.example/groupIdartifactIdmy-trace-spring-boot-starter/artifactIdversion1.0.0/version/dependency然后啥也不用干功能就自动生效了。这就是“约定优于配置”的体现。2.2 自动配置的底层机制Spring Boot 启动时会扫描META-INF/spring.factoriesBoot 2.7 之前或META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.importsBoot 2.7文件里面列的类会被自动加载为配置类。┌─────────────────┐ │ 应用启动 │ │ SpringBootApp │ └────────┬────────┘ │ ▼ ┌─────────────────────────────┐ │ 读取 META-INF/spring/*.imports │ │ 找到所有 AutoConfiguration │ └────────┬────────────────────┘ │ ▼ ┌─────────────────────────────┐ │ 条件判断ConditionalOnXxx │ │ 满足条件才生效 │ └────────┬────────────────────┘ │ ▼ ┌─────────────────────────────┐ │ 读取 application.yml 配置 │ │ EnableConfigurationProperties│ └────────┬────────────────────┘ │ ▼ ┌─────────────────────────────┐ │ 注册 Bean 到 Spring 容器 │ │ 功能生效 │ └─────────────────────────────┘你看整个流程就是发现配置 → 条件筛选 → 读取配置 → 注册 Bean。咱们自定义 Starter就是在这些环节里填空。三、实战封装一个 TraceId Starter咱们要做一个my-trace-spring-boot-starter功能很简单自动给每个 HTTP 请求生成traceId把traceId放到 MDC 里日志就能打印出来支持通过application.yml配置是否开启、以及 traceId 的请求头名称3.1 项目结构my-trace-spring-boot-starter/ ├── pom.xml └── src/ └── main/ ├── java/ │ └── com/example/trace/ │ ├── MyTraceAutoConfiguration.java # 自动配置类核心 │ ├── TraceProperties.java # 配置属性类 │ ├── TraceFilter.java # 实际功能过滤器 │ └── TraceContext.java # TraceId 上下文工具 └── resources/ └── META-INF/ └── spring/ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports3.2 第一步创建 Maven 模块引入关键依赖pom.xml里最重要的是spring-boot-autoconfigure和spring-boot-configuration-processor?xml version1.0 encodingUTF-8?projectmodelVersion4.0.0/modelVersion!-- 注意Starter 本身不需要 parent 是 spring-boot-starter-parent --!-- 但通常我们会定义 spring-boot.version 统一管理 --groupIdcom.example/groupIdartifactIdmy-trace-spring-boot-starter/artifactIdversion1.0.0-SNAPSHOT/versionpackagingjar/packagingpropertiesjava.version17/java.versionspring-boot.version3.2.0/spring-boot.version/propertiesdependencies!-- 核心自动配置支持 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-autoconfigure/artifactIdversion${spring-boot.version}/version/dependency!-- 可选配置属性提示写 yml 时有自动补全 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-configuration-processor/artifactIdversion${spring-boot.version}/versionoptionaltrue/optional/dependency!-- 功能依赖我们需要 Servlet 的 Filter --dependencygroupIdjakarta.servlet/groupIdartifactIdjakarta.servlet-api/artifactIdversion6.0.0/versionscopeprovided/scope!-- 由使用方提供 --/dependency!-- 日志MDC 需要 slf4j --dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactIdversion2.0.9/versionscopeprovided/scope/dependency/dependencies/project关键点spring-boot-autoconfigure是 Starter 的灵魂没有它就没有自动配置能力spring-boot-configuration-processor是贴心小助手编译时生成配置元数据写application.yml时有 IDE 提示Servlet 和日志依赖标记为provided因为使用方项目里肯定有3.3 第二步定义配置属性类用户可能想自定义 traceId 的请求头名称或者临时关闭这个功能。咱们用ConfigurationProperties来接收这些配置packagecom.example.trace;importorg.springframework.boot.context.properties.ConfigurationProperties;ConfigurationProperties(prefixmy.trace)publicclassTraceProperties{// 是否开启默认 trueprivatebooleanenabledtrue;// traceId 在 HTTP Header 中的名称privateStringheaderNameX-Trace-Id;// traceId 在日志 MDC 中的 keyprivateStringmdcKeytraceId;// getter / setter 省略...publicbooleanisEnabled(){returnenabled;}publicvoidsetEnabled(booleanenabled){this.enabledenabled;}publicStringgetHeaderName(){returnheaderName;}publicvoidsetHeaderName(StringheaderName){this.headerNameheaderName;}publicStringgetMdcKey(){returnmdcKey;}publicvoidsetMdcKey(StringmdcKey){this.mdcKeymdcKey;}}这样用户在application.yml里就能这样配my:trace:enabled:trueheader-name:X-Request-Idmdc-key:requestId3.4 第三步写实际功能代码TraceContext —— 生成和管理 traceIdpackagecom.example.trace;importorg.slf4j.MDC;importjava.util.UUID;publicclassTraceContext{// 生成一个简化的 traceId去掉 UUID 里的横杠取前 16 位publicstaticStringgenerateTraceId(){returnUUID.randomUUID().toString().replace(-,).substring(0,16);}// 放入 MDCpublicstaticvoidput(Stringkey,StringtraceId){MDC.put(key,traceId);}// 清理 MDCpublicstaticvoidclear(Stringkey){MDC.remove(key);}// 获取当前 traceIdpublicstaticStringget(Stringkey){returnMDC.get(key);}}TraceFilter —— 拦截请求处理 traceIdpackagecom.example.trace;importjakarta.servlet.*;importjakarta.servlet.http.HttpServletRequest;importjava.io.IOException;publicclassTraceFilterimplementsFilter{privatefinalTracePropertiesproperties;publicTraceFilter(TracePropertiesproperties){this.propertiesproperties;}OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{HttpServletRequesthttpRequest(HttpServletRequest)request;// 1. 优先从请求头里取上游服务传过来的StringtraceIdhttpRequest.getHeader(properties.getHeaderName());// 2. 没有就生成一个if(traceIdnull||traceId.isEmpty()){traceIdTraceContext.generateTraceId();}try{// 3. 放入 MDC日志就能打印了TraceContext.put(properties.getMdcKey(),traceId);// 4. 继续处理请求chain.doFilter(request,response);}finally{// 5. 请求结束清理 MDC防止线程复用时污染TraceContext.clear(properties.getMdcKey());}}}注意finally里的清理操作这是踩过坑的教训。Web 容器用线程池复用线程如果不清理 MDC下一个请求可能拿到上一个请求的 traceId那就乱套了。3.5 第四步编写自动配置类核心中的核心packagecom.example.trace;importorg.springframework.boot.autoconfigure.AutoConfiguration;importorg.springframework.boot.autoconfigure.condition.ConditionalOnProperty;importorg.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;importorg.springframework.boot.context.properties.EnableConfigurationProperties;importorg.springframework.boot.web.servlet.FilterRegistrationBean;importorg.springframework.context.annotation.Bean;AutoConfigurationConditionalOnWebApplication(typeConditionalOnWebApplication.Type.SERVLET)EnableConfigurationProperties(TraceProperties.class)ConditionalOnProperty(prefixmy.trace,nameenabled,havingValuetrue,matchIfMissingtrue)publicclassMyTraceAutoConfiguration{BeanpublicTraceFiltertraceFilter(TracePropertiesproperties){returnnewTraceFilter(properties);}BeanpublicFilterRegistrationBeanTraceFiltertraceFilterRegistration(TraceFiltertraceFilter){FilterRegistrationBeanTraceFilterregistrationnewFilterRegistrationBean();registration.setFilter(traceFilter);registration.addUrlPatterns(/*);registration.setOrder(Ordered.HIGHEST_PRECEDENCE);// 最早执行registration.setName(traceFilter);returnregistration;}}来咱们逐个拆解这些注解注解作用AutoConfiguration标记这是一个自动配置类Spring Boot 2.7 推荐替代ConfigurationConditionalOnWebApplication只在 Web 应用Servlet 环境下生效非 Web 项目不加载EnableConfigurationProperties让TraceProperties生效能读取application.ymlConditionalOnProperty根据配置决定是否生效。matchIfMissing true表示没配默认开启为什么要用FilterRegistrationBean而不是直接Bean返回 Filter因为直接Bean返回 FilterSpring Boot 会自动注册但你控制不了顺序和 URL 匹配。用FilterRegistrationBean可以更精细地控制setOrder()控制过滤器顺序addUrlPatterns()控制拦截路径setName()给过滤器起个名字3.6 第五步注册自动配置在src/main/resources/META-INF/spring/下创建文件文件名一字不能差org.springframework.boot.autoconfigure.AutoConfiguration.imports内容com.example.trace.MyTraceAutoConfiguration就这么简单一行类全限定名。Spring Boot 启动时会读取这个文件把里面的类都当成自动配置类去处理。历史包袱Spring Boot 2.7 之前用的是META-INF/spring.factories格式是org.springframework.boot.autoconfigure.EnableAutoConfiguration\ xxx。2.7 之后推荐用新的imports文件更轻量。如果你要兼容老版本两个都写上也没问题。四、验证在项目中使用4.1 安装到本地 Maven 仓库cdmy-trace-spring-boot-starter mvn cleaninstall4.2 在业务项目里引入dependencygroupIdcom.example/groupIdartifactIdmy-trace-spring-boot-starter/artifactIdversion1.0.0-SNAPSHOT/version/dependency4.3 配置日志格式打印 traceId在logback-spring.xml里appendernameCONSOLEclassch.qos.logback.core.ConsoleAppenderencoder!-- %X{traceId} 就是 MDC 里的值 --pattern%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %X{traceId} %logger{36} - %msg%n/pattern/encoder/appender4.4 启动项目看效果发一个请求curlhttp://localhost:8080/hello日志输出2024-01-15 10:23:45 [http-nio-8080-exec-1] INFO a3f7b2c8d9e1f5a2 com.example.demo.HelloController - 收到请求看到a3f7b2c8d9e1f5a2这个 traceId 了吗自动生成的如果你带请求头curl-HX-Trace-Id: my-custom-idhttp://localhost:8080/hello日志里就会打印my-custom-id实现了全链路追踪的基础能力。五、进阶让你的 Starter 更专业5.1 添加配置提示元数据在src/main/resources/META-INF/下创建additional-spring-configuration-metadata.json{properties:[{name:my.trace.enabled,type:java.lang.Boolean,description:是否开启 TraceId 自动追踪,defaultValue:true},{name:my.trace.header-name,type:java.lang.String,description:HTTP 请求头中 traceId 的字段名,defaultValue:X-Trace-Id}]}这样用户在 IDEA 里写application.yml时会有自动补全和提示my:trace:enabled:true# ← 有提示是否开启 TraceId 自动追踪5.2 条件注解大全按需取用Spring Boot 提供了一堆条件注解让你的 Starter 更智能// 类路径里有某个类时才生效ConditionalOnClass(namecom.fasterxml.jackson.databind.ObjectMapper)// 类路径里**没有**某个类时才生效ConditionalOnMissingClass(org.apache.commons.logging.Log)// 容器里有某个 Bean 时才生效ConditionalOnBean(namedataSource)// 容器里**没有**某个 Bean 时才生效避免重复注册ConditionalOnMissingBean(TraceFilter.class)// 配置了某个属性时才生效ConditionalOnProperty(prefixmy.trace,nameenabled,havingValuetrue)// 只在特定 Spring Profile 下生效ConditionalOnProfile(dev)最佳实践注册功能 Bean 时用ConditionalOnMissingBean让用户可以自定义覆盖BeanConditionalOnMissingBean// 用户自己定义了 TraceFilter 就用用户的publicTraceFiltertraceFilter(TracePropertiesproperties){returnnewTraceFilter(properties);}5.3 多环境适配Spring Boot 2.x vs 3.xSpring Boot 3.x 用的是jakarta.servlet包名而 2.x 用的是javax.servlet。如果你的 Starter 要兼容两个版本可以用条件注解// Jakarta 版本Boot 3.xAutoConfigurationConditionalOnClass(jakarta.servlet.Filter.class)publicclassJakartaTraceAutoConfiguration{...}// Javax 版本Boot 2.xAutoConfigurationConditionalOnClass(javax.servlet.Filter.class)publicclassJavaxTraceAutoConfiguration{...}或者更简单的做法分两个分支维护主版本用 Jakarta。六、常见坑点总结坑原因解决方案Starter 引入后没生效AutoConfiguration.imports文件路径/名称写错严格检查路径META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports配置类没读取到 yml没加EnableConfigurationProperties加上Bean 重复注册业务项目里也定义了同名 Bean用ConditionalOnMissingBean非 Web 项目报错Filter 依赖 Servlet 环境用ConditionalOnWebApplication线程池里 traceId 错乱MDC 没清理在finally里调用MDC.clear()配置提示不生效spring-boot-configuration-processor没加或没重新编译加依赖 mvn compile七、一句话总结自定义 Starter 就三步写功能 → 加条件 → 注册配置。核心思路是把重复的配置和初始化封装起来让使用方一行依赖开箱即用。说白了Starter 就是 Spring Boot 版的懒人包。你封装得越完善团队其他兄弟用起来越爽。你在项目里封装过 Starter 吗遇到过什么奇葩的坑欢迎在评论区交流

相关文章:

如何自定义一个Spring Boot Starter

如何自定义一个 Spring Boot Starter?从零封装一个自己的自动配置本文基于 Spring Boot 2.7 / 3.x,核心原理通用一、从一个真实场景说起 最近咱们团队在做内部工具链建设,好几个项目都要集成统一的日志追踪功能——每个请求进来,自…...

终极远程桌面游戏手柄控制解决方案:RdpGamepad完全指南

终极远程桌面游戏手柄控制解决方案:RdpGamepad完全指南 【免费下载链接】RdpGamepad Remote Desktop Plugin for Xbox Gamepads 项目地址: https://gitcode.com/gh_mirrors/rd/RdpGamepad 你是否曾经想在远程桌面连接中使用Xbox游戏手柄,却发现手…...

别再敲空格了!Markdown换行的3种正确姿势(含Typora、VS Code实测)

Markdown换行全指南:告别空格与回车的错误姿势 第一次用Markdown写文档时,你是否也遇到过这样的困惑:明明在编辑器里敲了回车换行,预览时却变成了一整段?或者在不同平台发布时,排版突然变得乱七八糟&#…...

Translumo:3分钟掌握高效屏幕实时翻译,游戏视频无障碍体验完整指南

Translumo:3分钟掌握高效屏幕实时翻译,游戏视频无障碍体验完整指南 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr…...

如何在5分钟内完成手机号码精准定位:免费工具终极指南

如何在5分钟内完成手机号码精准定位:免费工具终极指南 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/gh_mirr…...

如何实现Claude Code多设备配置同步:开发环境一致性的终极指南

如何实现Claude Code多设备配置同步:开发环境一致性的终极指南 【免费下载链接】claude-code Claude Code is an agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster by executing routine tasks, explaining…...

LangGraph MCP服务器:为AI助手注入生产级智能体开发模式

1. 项目概述:一个为AI助手注入LangGraph专业知识的MCP服务器如果你正在用Claude Desktop或者Cursor这类支持MCP(Model Context Protocol)的AI工具来开发LangGraph智能体,那你可能遇到过这样的场景:你问助手“怎么给我的…...

Microsemi Libero SoC 实战:用Verilog写个LED跑马灯,ModelSim仿真一次过(附源码)

Microsemi Libero SoC 实战:用Verilog写个LED跑马灯,ModelSim仿真一次过(附源码) 第一次接触FPGA开发板时,看着板载LED单调地闪烁总让人觉得意犹未尽。作为硬件描述语言的"Hello World",LED控制确…...

利用快马平台与copilot理念,十分钟打造智能代码生成器web原型

最近在尝试快速验证一个产品想法时,发现用传统方式从零开始搭建原型实在太耗时。正好了解到InsCode(快马)平台支持AI辅助开发,就尝试用它结合copilot的理念,十分钟内做出了一个智能代码生成器的web原型。整个过程比想象中顺利很多&#xff0c…...

LLM推理优化:KV缓存与长上下文处理关键技术

1. 项目背景与核心挑战在大型语言模型(LLM)的实际应用中,KV缓存优化和长上下文处理一直是工程落地的关键瓶颈。随着模型参数规模从7B增长到70B甚至更大,单次推理的显存占用和计算延迟问题愈发突出。特别是在处理长文档摘要、代码补…...

如何在macOS上搭建专业级桌面歌词同步系统

如何在macOS上搭建专业级桌面歌词同步系统 【免费下载链接】Lyrics Swift-based iTunes plug-in to display lyrics on the desktop. 项目地址: https://gitcode.com/gh_mirrors/lyr/Lyrics 你是否曾因听歌时找不到精准同步的歌词而烦恼?LyricsX 2.0是一款基…...

nnUNetv2模型集成(Ensemble)与后处理实战:如何自动找到并组合最优模型提升分割精度

nnUNetv2模型集成与后处理实战:解锁医学图像分割的终极性能 医学图像分割领域一直面临着数据稀缺、标注成本高和模型泛化能力不足等挑战。nnUNetv2作为当前最先进的自动分割框架,其核心价值不仅在于基础训练流程的自动化,更在于它提供了一套完…...

从一次真实的攻防演练讲起:攻击者是如何利用IIS PUT漏洞和短文件名猜解“拿下”一台Windows Server 2003的?

从一次真实的攻防演练讲起:攻击者是如何利用IIS PUT漏洞和短文件名猜解"拿下"一台Windows Server 2003的? 那是一个普通的周二下午,我们团队接到了一项内部红蓝对抗演练任务。目标系统是一个仍在运行的Windows Server 2003服务器&…...

将开源 Agent 框架 OpenClaw 无缝对接至 Taotoken 平台运行

将开源 Agent 框架 OpenClaw 无缝对接至 Taotoken 平台运行 1. OpenClaw 与 Taotoken 的集成价值 OpenClaw 作为开源 Agent 框架,为开发者提供了构建 AI 应用的灵活工具链。当需要对接多个大模型供应商时,直接管理不同厂商的 API Key 和计费方式会带来…...

英雄联盟自动化工具终极指南:League Akari 让你的游戏体验提升300%

英雄联盟自动化工具终极指南:League Akari 让你的游戏体验提升300% 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否经常因为…...

Godot-MCP终极指南:如何用AI助手5分钟创建你的第一个游戏

Godot-MCP终极指南:如何用AI助手5分钟创建你的第一个游戏 【免费下载链接】Godot-MCP An MCP for Godot that lets you create and edit games in the Godot game engine with tools like Claude 项目地址: https://gitcode.com/gh_mirrors/god/Godot-MCP Go…...

在 Ubuntu 上使用 Taotoken 官方价折扣节省 API 调用成本的实践

在 Ubuntu 上使用 Taotoken 官方价折扣节省 API 调用成本的实践 1. 准备工作 在 Ubuntu 环境中使用 Taotoken 平台调用大模型 API 前,需要完成几个基础配置步骤。首先确保系统已安装 Python 3.8 或更高版本,可以通过 python3 --version 命令验证。建议…...

GitHub加速代理突破:基于GatewayWorker的高性能解决方案

GitHub加速代理突破:基于GatewayWorker的高性能解决方案 【免费下载链接】github-proxy 项目地址: https://gitcode.com/gh_mirrors/gi/github-proxy 在开源开发的世界里,GitHub已成为全球开发者不可或缺的代码托管平台。然而,对于许…...

Translumo:如何用开源实时屏幕翻译工具5分钟打破语言壁垒

Translumo:如何用开源实时屏幕翻译工具5分钟打破语言壁垒 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo Tran…...

别再用霍夫变换了!用YOLOv8姿态评估模型5分钟搞定工业圆孔圆心定位(附完整代码)

工业视觉新范式:基于YOLOv8姿态评估的圆孔定位实战指南 在金属加工、电子元件检测等工业场景中,圆孔定位一直是机器视觉的基础需求。传统方法如霍夫变换虽然经典,但在复杂光照、部分遮挡或表面反光条件下,其表现往往不尽如人意。…...

OmenSuperHub终极指南:免费开源方案彻底释放惠普游戏本性能

OmenSuperHub终极指南:免费开源方案彻底释放惠普游戏本性能 【免费下载链接】OmenSuperHub 使用 WMI BIOS控制性能和风扇速度,自动解除DB功耗限制。 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 还在为惠普OMEN游戏本官方软件的臃…...

告别高德百度,用MapBox GL JS为你的Web应用定制一张专属地图(附完整代码)

用Mapbox GL JS打造品牌专属地图的完整实践指南 在电商平台的后台系统中,当我们需要展示全国门店分布时,那些千篇一律的蓝色标记点与标准地图样式总让人感觉与品牌调性格格不入。传统地图API虽然开箱即用,但当你的设计团队精心打造的UI遇上默…...

3个必知技巧:用 asusctl 彻底掌控你的 Linux 游戏本

3个必知技巧:用 asusctl 彻底掌控你的 Linux 游戏本 【免费下载链接】asusctl Daemon and tools to control your ASUS ROG laptop. Supersedes rog-core. 项目地址: https://gitcode.com/gh_mirrors/as/asusctl 你是否曾经在 Linux 系统上使用 ROG 游戏本时…...

高效免费音乐解锁工具:Unlock-Music完整实用指南

高效免费音乐解锁工具:Unlock-Music完整实用指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https://gi…...

GWAS数据清洗避坑指南:为什么你的杂合率质控总出问题?从`--indep-pairwise`参数说起

GWAS数据清洗避坑指南:为什么你的杂合率质控总出问题?从--indep-pairwise参数说起 在基因组关联分析(GWAS)中,数据质量控制的每个环节都像多米诺骨牌——一步出错可能导致整个分析链条崩塌。而杂合率质控(H…...

UUV Simulator水下机器人仿真终极指南:从零到精通完全掌握

UUV Simulator水下机器人仿真终极指南:从零到精通完全掌握 【免费下载链接】uuv_simulator Gazebo/ROS packages for underwater robotics simulation 项目地址: https://gitcode.com/gh_mirrors/uu/uuv_simulator 想要探索水下机器人的奥秘,却苦…...

英雄联盟本地自动化工具League Akari:重新定义你的游戏体验

英雄联盟本地自动化工具League Akari:重新定义你的游戏体验 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否曾在英雄选择阶段…...

TwitchNoSub浏览器扩展:5分钟免费解锁Twitch订阅限制的完整指南

TwitchNoSub浏览器扩展:5分钟免费解锁Twitch订阅限制的完整指南 【免费下载链接】TwitchNoSub An extension to watch sub only VOD on Twitch 项目地址: https://gitcode.com/gh_mirrors/tw/TwitchNoSub 你是否曾经因为错过心爱主播的直播而懊恼&#xff0c…...

保姆级教程:在Rocky Linux虚拟机上用Chrony搭建内网时间服务器

企业级内网时间同步方案:基于Rocky Linux与Chrony的实战部署指南 在分布式计算环境中,时间同步的精度往往直接影响到日志分析、事务处理甚至安全认证的可靠性。当网络环境存在隔离限制时,如何构建一个高可用的内网时间同步体系?本…...

MuseTalk 1.5技术深度解析:实时高质量唇形同步的架构演进与性能优化

MuseTalk 1.5技术深度解析:实时高质量唇形同步的架构演进与性能优化 【免费下载链接】MuseTalk MuseTalk: Real-Time High Quality Lip Synchorization with Latent Space Inpainting 项目地址: https://gitcode.com/gh_mirrors/mu/MuseTalk MuseTalk是由腾讯…...