<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on Jizuiba`s Blog</title><link>https://jizuiba.netlify.app/posts/</link><description>Recent content in Posts on Jizuiba`s Blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Thu, 23 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://jizuiba.netlify.app/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Git Worktree</title><link>https://jizuiba.netlify.app/posts/git-worktree/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><guid>https://jizuiba.netlify.app/posts/git-worktree/</guid><description>&lt;h2 id="什么是git-worktree"&gt;什么是Git Worktree？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;在一个仓库里，同时打开多个“分身”，每个分身对应不同分支。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="它有什么用呢"&gt;它有什么用呢？&lt;/h3&gt;
&lt;p&gt;同时在多分支上工作，很适合当前 vibe coding 的形式。&lt;/p&gt;
&lt;p&gt;古法编码时则可以避免频繁的checkout和可能需要的stash&lt;/p&gt;</description></item><item><title>RAG 检索优化</title><link>https://jizuiba.netlify.app/posts/rag-%E6%A3%80%E7%B4%A2%E4%BC%98%E5%8C%96/</link><pubDate>Sat, 28 Mar 2026 00:00:00 +0000</pubDate><guid>https://jizuiba.netlify.app/posts/rag-%E6%A3%80%E7%B4%A2%E4%BC%98%E5%8C%96/</guid><description>&lt;h2 id="检索优化是在干啥"&gt;检索优化是在干啥？&lt;/h2&gt;
&lt;p&gt;基础的 RAG 调用：&lt;/p&gt;
&lt;figure class="article-codeblock article-codeblock--text" data-code-language="text" style="--code-max-height: 32rem;"&gt;&lt;figcaption class="article-codeblock__header" aria-label="Code block tools"&gt;&lt;button
 type="button"
 class="article-codeblock__copy"
 data-copy-default="复制"
 data-copy-success="已复制"
 data-copy-error="失败"
 aria-label="复制"&gt;
 &lt;svg class="article-codeblock__copy-icon" width="14" height="14" viewBox="0 0 24 24" aria-hidden="true"&gt;
 &lt;rect x="9" y="9" width="13" height="13" rx="2" ry="2"&gt;&lt;/rect&gt;
 &lt;path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"&gt;&lt;/path&gt;
 &lt;/svg&gt;
 &lt;span class="article-codeblock__copy-text"&gt;复制&lt;/span&gt;
 &lt;/button&gt;&lt;span class="article-codeblock__language" aria-label="Code language"&gt;text&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="article-codeblock__body"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;用户问题 → embedding → 向量检索 → top-k → 给 LLM&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
 &lt;/figure&gt;&lt;p&gt;可能存在的问题：&lt;/p&gt;</description></item><item><title>RAG 相关的知识名词</title><link>https://jizuiba.netlify.app/posts/rag-%E7%9B%B8%E5%85%B3%E7%9A%84%E7%9F%A5%E8%AF%86%E5%90%8D%E8%AF%8D/</link><pubDate>Fri, 27 Mar 2026 00:00:00 +0000</pubDate><guid>https://jizuiba.netlify.app/posts/rag-%E7%9B%B8%E5%85%B3%E7%9A%84%E7%9F%A5%E8%AF%86%E5%90%8D%E8%AF%8D/</guid><description>&lt;h2 id="chunk分块"&gt;Chunk（分块）&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;是什么&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;把长文档切一小段一小段，再做向量化存储。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;为什么需要它&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LLM 的上下文限制&lt;/li&gt;
&lt;li&gt;检索时需要“精准命中片段”而不是一整片文章&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;例如&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;一篇10000字的文章 -&amp;gt; 切成：&lt;/p&gt;</description></item><item><title>大模型常见的各类名词都有什么</title><link>https://jizuiba.netlify.app/posts/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%B8%B8%E8%A7%81%E7%9A%84%E5%90%84%E7%B1%BB%E5%90%8D%E8%AF%8D%E9%83%BD%E6%9C%89%E4%BB%80%E4%B9%88/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><guid>https://jizuiba.netlify.app/posts/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%B8%B8%E8%A7%81%E7%9A%84%E5%90%84%E7%B1%BB%E5%90%8D%E8%AF%8D%E9%83%BD%E6%9C%89%E4%BB%80%E4%B9%88/</guid><description>&lt;h2 id="一数据处理单元token"&gt;一、数据处理单元：Token&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;： 大模型处理文本的最小单位，通过分词器将文本切分为片段&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二临时记忆体context"&gt;二、临时记忆体：Context&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：大模型每次处理任务是接收的信息总和&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组成&lt;/strong&gt;：用户问题，对话历史、当前输出Token、工具列表、System Prompt等&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;容量限制&lt;/strong&gt;：由 &lt;strong&gt;Context Windows&lt;/strong&gt;（上下文窗口）定义，即最大可以处理的Token数&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="三互层的语义约束prompt-与-system-prompt"&gt;三、互层的语义约束：Prompt 与 System Prompt&lt;/h2&gt;
&lt;p&gt;可以认为提示词是一种&lt;strong&gt;非确定性编程输入&lt;/strong&gt;。&lt;/p&gt;</description></item><item><title>Java 中的双亲委派模型</title><link>https://jizuiba.netlify.app/posts/java-%E4%B8%AD%E7%9A%84%E5%8F%8C%E4%BA%B2%E5%A7%94%E6%B4%BE%E6%A8%A1%E5%9E%8B/</link><pubDate>Wed, 22 Oct 2025 00:00:00 +0000</pubDate><guid>https://jizuiba.netlify.app/posts/java-%E4%B8%AD%E7%9A%84%E5%8F%8C%E4%BA%B2%E5%A7%94%E6%B4%BE%E6%A8%A1%E5%9E%8B/</guid><description>&lt;h2 id="什么是双亲委派模型"&gt;什么是双亲委派模型？&lt;/h2&gt;
&lt;p&gt;在 Java 虚拟机（JVM）中，&lt;strong&gt;双亲委派模型&lt;/strong&gt;（Parent Delegation Model）是类加载器（&lt;code&gt;ClassLoader&lt;/code&gt;）加载类时遵循的核心机制。&lt;/p&gt;
&lt;p&gt;其工作流程如下：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;当一个类加载器收到类加载请求时，它&lt;strong&gt;不会立即尝试自己加载&lt;/strong&gt;，而是&lt;strong&gt;先将请求委派给父类加载器&lt;/strong&gt;。&lt;br&gt;
父类加载器会继续向上委派，直到启动类加载器（Bootstrap ClassLoader）。&lt;br&gt;
只有当所有父类加载器都无法加载该类时，当前类加载器才会尝试自己加载。&lt;/p&gt;</description></item><item><title>JWT与JWE：区别、使用场景及安全实践</title><link>https://jizuiba.netlify.app/posts/jwt%E4%B8%8Ejwe%E5%8C%BA%E5%88%AB%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E5%8F%8A%E5%AE%89%E5%85%A8%E5%AE%9E%E8%B7%B5/</link><pubDate>Wed, 24 Sep 2025 00:00:00 +0000</pubDate><guid>https://jizuiba.netlify.app/posts/jwt%E4%B8%8Ejwe%E5%8C%BA%E5%88%AB%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E5%8F%8A%E5%AE%89%E5%85%A8%E5%AE%9E%E8%B7%B5/</guid><description>&lt;h2 id="一什么是-jwt"&gt;一、什么是 JWT？&lt;/h2&gt;
&lt;p&gt;JWT，全称是 &lt;strong&gt;JSON Web Token&lt;/strong&gt;，是 &lt;a href="https://datatracker.ietf.org/doc/html/rfc7519"&gt;https://datatracker.ietf.org/doc/html/rfc7519&lt;/a&gt; 制定的一种开放标准，用于在各方之间安全地传递声明（claims）。&lt;/p&gt;
&lt;p&gt;一个标准的 JWT 通常由三部分组成，使用 &lt;code&gt;.&lt;/code&gt; 分隔：&lt;/p&gt;</description></item><item><title>Windows 下安装 fnm</title><link>https://jizuiba.netlify.app/posts/windows-%E4%B8%8B%E5%AE%89%E8%A3%85-fnm/</link><pubDate>Mon, 15 Sep 2025 00:00:00 +0000</pubDate><guid>https://jizuiba.netlify.app/posts/windows-%E4%B8%8B%E5%AE%89%E8%A3%85-fnm/</guid><description>&lt;h2 id="什么是-fnm"&gt;什么是 fnm&lt;/h2&gt;
&lt;p&gt;fnm 是一款 Node.js 的版本管理工具。&lt;/p&gt;
&lt;h2 id="什么是-scoop"&gt;什么是 scoop&lt;/h2&gt;
&lt;p&gt;Scoop 是一个适用于 Windows 操作系统 的 命令行软件包管理器，它的主要作用是让你能够 通过简单的命令快速安装、更新和管理各种常用的 Windows 软件。&lt;/p&gt;</description></item><item><title>Spring AI 笔记二</title><link>https://jizuiba.netlify.app/posts/spring-ai-%E7%AC%94%E8%AE%B0%E4%BA%8C/</link><pubDate>Thu, 17 Jul 2025 00:00:00 +0000</pubDate><guid>https://jizuiba.netlify.app/posts/spring-ai-%E7%AC%94%E8%AE%B0%E4%BA%8C/</guid><description>&lt;p&gt;&lt;strong&gt;前提：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;笔记一&lt;/strong&gt;中有提到如何获取 API KEY 和如何构建简单的 AI 应用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spring AI 相关相关依赖引入失败，请参考仓库配置&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="1-项目构建"&gt;1. 项目构建&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;创建一个新的工程&lt;/li&gt;
&lt;li&gt;引入依赖&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class="article-codeblock article-codeblock--xml" data-code-language="xml" style="--code-max-height: 32rem;"&gt;&lt;figcaption class="article-codeblock__header" aria-label="Code block tools"&gt;&lt;button
 type="button"
 class="article-codeblock__copy"
 data-copy-default="复制"
 data-copy-success="已复制"
 data-copy-error="失败"
 aria-label="复制"&gt;
 &lt;svg class="article-codeblock__copy-icon" width="14" height="14" viewBox="0 0 24 24" aria-hidden="true"&gt;
 &lt;rect x="9" y="9" width="13" height="13" rx="2" ry="2"&gt;&lt;/rect&gt;
 &lt;path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"&gt;&lt;/path&gt;
 &lt;/svg&gt;
 &lt;span class="article-codeblock__copy-text"&gt;复制&lt;/span&gt;
 &lt;/button&gt;&lt;span class="article-codeblock__language" aria-label="Code language"&gt;xml&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="article-codeblock__body"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-web&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.ai&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-ai-starter-model-openai&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.alibaba.cloud.ai&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-ai-alibaba-starter-memory&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;redis.clients&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;jedis&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;5.2.0&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;mysql&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;mysql-connector-java&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;8.0.32&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- 支持文件会话记忆持久化的序列化 --&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- 此依赖并未上传到中央仓库 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- 可见 https://github.com/jizuiba/spring-ai-demo/tree/main/spring-boot-kryo-pool-starter 下载安装--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;cn.jizuiba&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;kryo-pool-spring-boot-starter&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.0.0&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
 &lt;/figure&gt;&lt;hr&gt;
&lt;h2 id="2-开发"&gt;2. 开发&lt;/h2&gt;
&lt;p&gt;使用 硅基流动平台 的 Qwen/Qwen3-8B 模型
提供基于以下几种形式的对话记忆存储：&lt;/p&gt;</description></item><item><title>Spring AI 笔记一</title><link>https://jizuiba.netlify.app/posts/spring-ai-%E7%AC%94%E8%AE%B0%E4%B8%80/</link><pubDate>Wed, 16 Jul 2025 00:00:00 +0000</pubDate><guid>https://jizuiba.netlify.app/posts/spring-ai-%E7%AC%94%E8%AE%B0%E4%B8%80/</guid><description>&lt;h2 id="1-模型-api-key-准备"&gt;1. 模型 API KEY 准备&lt;/h2&gt;
&lt;p&gt;首先需要在以下平台去获取一个API KEY&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IFLY （讯飞星火）&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;平台 lite 模型可以无限次调用，学习很好用 (๑•̀ㅂ•́)و✧
也有其他的模型可供调用&lt;/p&gt;</description></item><item><title>Docker 笔记</title><link>https://jizuiba.netlify.app/posts/docker-%E7%AC%94%E8%AE%B0/</link><pubDate>Sun, 13 Jul 2025 00:00:00 +0000</pubDate><guid>https://jizuiba.netlify.app/posts/docker-%E7%AC%94%E8%AE%B0/</guid><description>&lt;h2 id="一安装-docker"&gt;一、安装 Docker&lt;/h2&gt;
&lt;p&gt;系统 Ubuntu&lt;/p&gt;
&lt;h3 id="1-更新系统软件包"&gt;1. 更新系统软件包&lt;/h3&gt;
&lt;figure class="article-codeblock article-codeblock--bash" data-code-language="bash" style="--code-max-height: 32rem;"&gt;&lt;figcaption class="article-codeblock__header" aria-label="Code block tools"&gt;&lt;button
 type="button"
 class="article-codeblock__copy"
 data-copy-default="复制"
 data-copy-success="已复制"
 data-copy-error="失败"
 aria-label="复制"&gt;
 &lt;svg class="article-codeblock__copy-icon" width="14" height="14" viewBox="0 0 24 24" aria-hidden="true"&gt;
 &lt;rect x="9" y="9" width="13" height="13" rx="2" ry="2"&gt;&lt;/rect&gt;
 &lt;path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"&gt;&lt;/path&gt;
 &lt;/svg&gt;
 &lt;span class="article-codeblock__copy-text"&gt;复制&lt;/span&gt;
 &lt;/button&gt;&lt;span class="article-codeblock__language" aria-label="Code language"&gt;bash&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="article-codeblock__body"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt upgrade -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
 &lt;/figure&gt;&lt;hr&gt;
&lt;h3 id="2-安装依赖包允许-apt-使用-https"&gt;2. 安装依赖包（允许 apt 使用 HTTPS）&lt;/h3&gt;
&lt;figure class="article-codeblock article-codeblock--bash" data-code-language="bash" style="--code-max-height: 32rem;"&gt;&lt;figcaption class="article-codeblock__header" aria-label="Code block tools"&gt;&lt;button
 type="button"
 class="article-codeblock__copy"
 data-copy-default="复制"
 data-copy-success="已复制"
 data-copy-error="失败"
 aria-label="复制"&gt;
 &lt;svg class="article-codeblock__copy-icon" width="14" height="14" viewBox="0 0 24 24" aria-hidden="true"&gt;
 &lt;rect x="9" y="9" width="13" height="13" rx="2" ry="2"&gt;&lt;/rect&gt;
 &lt;path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"&gt;&lt;/path&gt;
 &lt;/svg&gt;
 &lt;span class="article-codeblock__copy-text"&gt;复制&lt;/span&gt;
 &lt;/button&gt;&lt;span class="article-codeblock__language" aria-label="Code language"&gt;bash&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="article-codeblock__body"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ca-certificates &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; curl &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gnupg &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; lsb-release &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
 &lt;/figure&gt;&lt;hr&gt;
&lt;h3 id="3-添加-docker-的官方-gpg-密钥"&gt;3. 添加 Docker 的官方 GPG 密钥&lt;/h3&gt;
&lt;figure class="article-codeblock article-codeblock--bash" data-code-language="bash" style="--code-max-height: 32rem;"&gt;&lt;figcaption class="article-codeblock__header" aria-label="Code block tools"&gt;&lt;button
 type="button"
 class="article-codeblock__copy"
 data-copy-default="复制"
 data-copy-success="已复制"
 data-copy-error="失败"
 aria-label="复制"&gt;
 &lt;svg class="article-codeblock__copy-icon" width="14" height="14" viewBox="0 0 24 24" aria-hidden="true"&gt;
 &lt;rect x="9" y="9" width="13" height="13" rx="2" ry="2"&gt;&lt;/rect&gt;
 &lt;path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"&gt;&lt;/path&gt;
 &lt;/svg&gt;
 &lt;span class="article-codeblock__copy-text"&gt;复制&lt;/span&gt;
 &lt;/button&gt;&lt;span class="article-codeblock__language" aria-label="Code language"&gt;bash&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="article-codeblock__body"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkdir -p /etc/apt/keyrings
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg &lt;span class="p"&gt;|&lt;/span&gt; sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
 &lt;/figure&gt;&lt;hr&gt;
&lt;h3 id="4-设置-docker-的稳定版仓库"&gt;4. 设置 Docker 的稳定版仓库&lt;/h3&gt;
&lt;figure class="article-codeblock article-codeblock--bash" data-code-language="bash" style="--code-max-height: 32rem;"&gt;&lt;figcaption class="article-codeblock__header" aria-label="Code block tools"&gt;&lt;button
 type="button"
 class="article-codeblock__copy"
 data-copy-default="复制"
 data-copy-success="已复制"
 data-copy-error="失败"
 aria-label="复制"&gt;
 &lt;svg class="article-codeblock__copy-icon" width="14" height="14" viewBox="0 0 24 24" aria-hidden="true"&gt;
 &lt;rect x="9" y="9" width="13" height="13" rx="2" ry="2"&gt;&lt;/rect&gt;
 &lt;path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"&gt;&lt;/path&gt;
 &lt;/svg&gt;
 &lt;span class="article-codeblock__copy-text"&gt;复制&lt;/span&gt;
 &lt;/button&gt;&lt;span class="article-codeblock__language" aria-label="Code language"&gt;bash&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="article-codeblock__body"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; stable&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
 &lt;/figure&gt;&lt;hr&gt;
&lt;h3 id="5-更新-apt-包索引并安装-docker"&gt;5. 更新 apt 包索引并安装 Docker&lt;/h3&gt;
&lt;figure class="article-codeblock article-codeblock--bash" data-code-language="bash" style="--code-max-height: 32rem;"&gt;&lt;figcaption class="article-codeblock__header" aria-label="Code block tools"&gt;&lt;button
 type="button"
 class="article-codeblock__copy"
 data-copy-default="复制"
 data-copy-success="已复制"
 data-copy-error="失败"
 aria-label="复制"&gt;
 &lt;svg class="article-codeblock__copy-icon" width="14" height="14" viewBox="0 0 24 24" aria-hidden="true"&gt;
 &lt;rect x="9" y="9" width="13" height="13" rx="2" ry="2"&gt;&lt;/rect&gt;
 &lt;path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"&gt;&lt;/path&gt;
 &lt;/svg&gt;
 &lt;span class="article-codeblock__copy-text"&gt;复制&lt;/span&gt;
 &lt;/button&gt;&lt;span class="article-codeblock__language" aria-label="Code language"&gt;bash&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="article-codeblock__body"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
 &lt;/figure&gt;&lt;blockquote&gt;
&lt;p&gt;说明：从 Docker 20.10 开始，&lt;code&gt;docker-compose&lt;/code&gt; 已经作为一个插件 &lt;code&gt;docker-compose-plugin&lt;/code&gt; 提供，不再单独安装旧版的 &lt;code&gt;docker-compose&lt;/code&gt;（Python 版本）。&lt;/p&gt;</description></item><item><title>Jenkins 笔记</title><link>https://jizuiba.netlify.app/posts/jenkins-%E7%AC%94%E8%AE%B0/</link><pubDate>Sun, 13 Jul 2025 00:00:00 +0000</pubDate><guid>https://jizuiba.netlify.app/posts/jenkins-%E7%AC%94%E8%AE%B0/</guid><description>&lt;h1 id="1-如何安装"&gt;1 如何安装？&lt;/h1&gt;
&lt;h2 id="11-直接安装在服务器上"&gt;1.1 直接安装在服务器上&lt;/h2&gt;
&lt;p&gt;系统 Ubuntu&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="1-更新系统软件包"&gt;(1) 更新系统软件包&lt;/h3&gt;
&lt;p&gt;没有更新系统包可能导致后续的安装失败&lt;/p&gt;
&lt;figure class="article-codeblock article-codeblock--bash" data-code-language="bash" style="--code-max-height: 32rem;"&gt;&lt;figcaption class="article-codeblock__header" aria-label="Code block tools"&gt;&lt;button
 type="button"
 class="article-codeblock__copy"
 data-copy-default="复制"
 data-copy-success="已复制"
 data-copy-error="失败"
 aria-label="复制"&gt;
 &lt;svg class="article-codeblock__copy-icon" width="14" height="14" viewBox="0 0 24 24" aria-hidden="true"&gt;
 &lt;rect x="9" y="9" width="13" height="13" rx="2" ry="2"&gt;&lt;/rect&gt;
 &lt;path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"&gt;&lt;/path&gt;
 &lt;/svg&gt;
 &lt;span class="article-codeblock__copy-text"&gt;复制&lt;/span&gt;
 &lt;/button&gt;&lt;span class="article-codeblock__language" aria-label="Code language"&gt;bash&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="article-codeblock__body"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt upgrade -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
 &lt;/figure&gt;&lt;hr&gt;
&lt;h3 id="2-安装-javajenkins-依赖-java"&gt;(2) 安装 Java（Jenkins 依赖 Java）&lt;/h3&gt;
&lt;p&gt;推荐使用 Java 11 或 Java 17（LTS 版本）。&lt;/p&gt;</description></item><item><title>Bean生命周期管理错误案例</title><link>https://jizuiba.netlify.app/posts/bean%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E7%AE%A1%E7%90%86%E9%94%99%E8%AF%AF%E6%A1%88%E4%BE%8B/</link><pubDate>Thu, 10 Jul 2025 00:00:00 +0000</pubDate><guid>https://jizuiba.netlify.app/posts/bean%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E7%AE%A1%E7%90%86%E9%94%99%E8%AF%AF%E6%A1%88%E4%BE%8B/</guid><description>&lt;h2 id="一错误案例"&gt;一、错误案例&lt;/h2&gt;
&lt;figure class="article-codeblock article-codeblock--java" data-code-language="java" style="--code-max-height: 32rem;"&gt;&lt;figcaption class="article-codeblock__header" aria-label="Code block tools"&gt;&lt;button
 type="button"
 class="article-codeblock__copy"
 data-copy-default="复制"
 data-copy-success="已复制"
 data-copy-error="失败"
 aria-label="复制"&gt;
 &lt;svg class="article-codeblock__copy-icon" width="14" height="14" viewBox="0 0 24 24" aria-hidden="true"&gt;
 &lt;rect x="9" y="9" width="13" height="13" rx="2" ry="2"&gt;&lt;/rect&gt;
 &lt;path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"&gt;&lt;/path&gt;
 &lt;/svg&gt;
 &lt;span class="article-codeblock__copy-text"&gt;复制&lt;/span&gt;
 &lt;/button&gt;&lt;span class="article-codeblock__language" aria-label="Code language"&gt;java&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="article-codeblock__body"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Slf4j&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyService&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nd"&gt;@Value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;${resend.to}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;to =&amp;gt; {}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 此时的to为null&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
 &lt;/figure&gt;&lt;p&gt;Spring 调用构造函数（此时&lt;code&gt;to&lt;/code&gt;还未注入，字段是&lt;code&gt;null&lt;/code&gt;）。&lt;/p&gt;</description></item><item><title>本地消息表实现</title><link>https://jizuiba.netlify.app/posts/%E6%9C%AC%E5%9C%B0%E6%B6%88%E6%81%AF%E8%A1%A8%E5%AE%9E%E7%8E%B0/</link><pubDate>Wed, 14 May 2025 00:00:00 +0000</pubDate><guid>https://jizuiba.netlify.app/posts/%E6%9C%AC%E5%9C%B0%E6%B6%88%E6%81%AF%E8%A1%A8%E5%AE%9E%E7%8E%B0/</guid><description>&lt;p&gt;本地消息表是一个实现弱最终一致性的方案，通过对操作状态进行本地记录，失败时进行一定次数的重试，来保证调用时成功的可能。&lt;/p&gt;
&lt;h2 id="核心代码"&gt;核心代码：&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;LocalMessageDO&lt;/code&gt;：本地消息表&lt;/p&gt;</description></item><item><title>CompletableFuture常用API</title><link>https://jizuiba.netlify.app/posts/completablefuture%E5%B8%B8%E7%94%A8api/</link><pubDate>Thu, 03 Apr 2025 00:00:00 +0000</pubDate><guid>https://jizuiba.netlify.app/posts/completablefuture%E5%B8%B8%E7%94%A8api/</guid><description>&lt;h2 id="一创建-completablefuture"&gt;一、创建 CompletableFuture&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;CompletableFuture.supplyAsync(Supplier&amp;lt;U&amp;gt; supplier)&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
异步执行一个任务并返回结果。任务会在默认的线程池（ForkJoinPool.commonPool）中执行。&lt;/p&gt;
&lt;figure class="article-codeblock article-codeblock--java" data-code-language="java" style="--code-max-height: 32rem;"&gt;&lt;figcaption class="article-codeblock__header" aria-label="Code block tools"&gt;&lt;button
 type="button"
 class="article-codeblock__copy"
 data-copy-default="复制"
 data-copy-success="已复制"
 data-copy-error="失败"
 aria-label="复制"&gt;
 &lt;svg class="article-codeblock__copy-icon" width="14" height="14" viewBox="0 0 24 24" aria-hidden="true"&gt;
 &lt;rect x="9" y="9" width="13" height="13" rx="2" ry="2"&gt;&lt;/rect&gt;
 &lt;path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"&gt;&lt;/path&gt;
 &lt;/svg&gt;
 &lt;span class="article-codeblock__copy-text"&gt;复制&lt;/span&gt;
 &lt;/button&gt;&lt;span class="article-codeblock__language" aria-label="Code language"&gt;java&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="article-codeblock__body"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;future&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CompletableFuture&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;supplyAsync&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Hello, World!&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
 &lt;/figure&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;CompletableFuture.runAsync(Runnable runnable)&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
异步执行一个没有返回值的任务。&lt;/p&gt;</description></item><item><title>多数据源Druid实现</title><link>https://jizuiba.netlify.app/posts/%E5%A4%9A%E6%95%B0%E6%8D%AE%E6%BA%90druid%E5%AE%9E%E7%8E%B0/</link><pubDate>Thu, 03 Apr 2025 00:00:00 +0000</pubDate><guid>https://jizuiba.netlify.app/posts/%E5%A4%9A%E6%95%B0%E6%8D%AE%E6%BA%90druid%E5%AE%9E%E7%8E%B0/</guid><description>&lt;h2 id="1-引入-druid-后是否需要自己维护连接池"&gt;&lt;strong&gt;1. 引入 Druid 后是否需要自己维护连接池？&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id="11-druid-的作用"&gt;&lt;strong&gt;1.1 Druid 的作用&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Druid&lt;/code&gt; 是一个高性能的数据库连接池组件，它负责管理数据库连接的生命周期。&lt;/li&gt;
&lt;li&gt;一旦配置好 &lt;code&gt;Druid&lt;/code&gt; 数据源，所有的连接获取和释放都会由 &lt;code&gt;Druid&lt;/code&gt; 自动处理。&lt;/li&gt;
&lt;li&gt;只需要在配置文件中定义数据源的相关参数（如最大连接数、最小空闲连接数等），&lt;code&gt;Druid&lt;/code&gt; 会根据这些参数动态管理连接池。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="12-不需要手动维护连接池"&gt;&lt;strong&gt;1.2 不需要手动维护连接池&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在使用 &lt;code&gt;JdbcTemplate&lt;/code&gt; 或其他数据库操作工具时，&lt;code&gt;Druid&lt;/code&gt; 会自动从连接池中获取连接，并在操作完成后将连接返回到池中。&lt;/li&gt;
&lt;li&gt;因此，不需要手动创建或关闭数据库连接，所有这些工作都由 &lt;code&gt;Druid&lt;/code&gt; 完成。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="2-涉及多种数据源时的处理方式"&gt;&lt;strong&gt;2. 涉及多种数据源时的处理方式&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;当项目中需要支持多个数据源（如 MySQL、Oracle、GBase 等）时，Spring Boot 提供了灵活的机制来实现多数据源的支持。以下是具体的解决方案：&lt;/p&gt;</description></item></channel></rss>