<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Seabrid - 全栈开发者</title>
    <link>https://seabrid.cn</link>
    <description>Seabrid 的个人技术博客，专注于 Java、Vue、TypeScript 全栈开发与 AI 应用探索。</description>
    <language>zh-cn</language>
    <atom:link href="https://seabrid.cn/rss.xml" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sun, 13 Sep 2026 04:00:33 GMT</lastBuildDate>
    <item>
      <title>Qdrant 深度解析：面向向量搜索的高性能数据库</title>
      <link>https://seabrid.cn/posts/qdrant-shendujieximianxiangxiangliangsousuodegaoxingnengshujuku</link>
      <guid>https://seabrid.cn/posts/qdrant-shendujieximianxiangxiangliangsousuodegaoxingnengshujuku</guid>
      <description>## 一、什么是 Qdrant？ Qdrant 是一个**开源的向量数据库（Vector Database）**，专门用于存储、管理和检索高维向量数据。它通过高效的**近似最近邻搜索（ANN, Approximate Nearest Neighbor）**算法，实现毫秒级的相似度查询。 **核心定位：** &gt; Qdrant = 向量存储 + 相似度搜索 + 过滤能力 **适用场景：** - 语义搜索（Semantic Search） - 推荐系统（Recommendation System） - 图像/音频检索 - 大模型 RAG（知识检索增强） --- ## 二、为什么需要向量数据库？ 传统数据库（如 MySQL、PostgreSQL）主要处理结构化数据，而 AI 应用更多是**"语义相似性"**问题，例如： - "找和这段话意思相近的内容" - "推荐和用户兴趣相似的商品" **向量表...</description>
      <pubDate>Wed, 24 Jun 2026 23:43:05 GMT</pubDate>
    </item>
    <item>
      <title>Umi-OCR Docker 部署与 API 接口调用指南</title>
      <link>https://seabrid.cn/posts/umi-ocr-docker-bushuyu-api-jiekoudiaoyongzhinan</link>
      <guid>https://seabrid.cn/posts/umi-ocr-docker-bushuyu-api-jiekoudiaoyongzhinan</guid>
      <description>Umi-OCR 是一款免费、开源、可批量的离线 OCR 软件，支持截屏识别、批量导入图片、PDF 文档识别、排除水印/页眉页脚、扫描/生成二维码等功能。其 Docker 部署方案使得在 Linux 服务器或桌面环境下运行和集成变得非常便捷。 ### 一、Docker 部署 Umi-OCR #### 1. 部署前提 在开始部署前，请确保您的主机 CPU 支持 AVX 指令集，这是运行 Umi-OCR Linux 版本的必要条件。 ```bash lscpu | grep avx ``` 如果命令输出中包含 `avx` 和 `avx2`，则可以继续部署。 #### 2. 构建 Docker 镜像 首先，下载官方提供的 Dockerfile 并构建镜像。 ```bash # 1.</description>
      <pubDate>Mon, 25 May 2026 18:42:19 GMT</pubDate>
    </item>
    <item>
      <title>基于Spring AI Alibaba构建智能点餐助手Agent</title>
      <link>https://seabrid.cn/posts/jiyuspring-ai-alibabagoujianzhinengdiancanzhushouagent</link>
      <guid>https://seabrid.cn/posts/jiyuspring-ai-alibabagoujianzhinengdiancanzhushouagent</guid>
      <description>&gt; 手把手带你入门Agent开发，实现一个能理解自然语言、自动推荐菜品的AI点餐助手 ## 一、背景：从规则到智能 传统的点餐推荐通常由硬编码逻辑实现——根据人数计算菜品数量，按荤素比例筛选，最后返回结果。这种方式虽然确定、高效，但缺乏**灵活性**：用户无法用自然语言表达“今晚4个人，想吃辣一点的，预算200左右”，更无法追问调整。 随着大模型和Agent技术的成熟，我们可以构建一个**智能点餐Agent**：用户用平常说话的方式提出需求，Agent自动调用工具函数完成推荐，并以友好的格式返回结果。 Spring AI Alibaba 提供了完整的 Agent 开发框架（基于 `ReactAgent`），结合阿里云 DashScope 大模型，可以快速搭建此类应用。 本文将带你从零开始，开发一个功能完整的智能点餐助手。 --- ## 二、环境准备 ### 2.1 基础要求 - JDK 1...</description>
      <pubDate>Tue, 12 May 2026 22:29:59 GMT</pubDate>
    </item>
    <item>
      <title>1000 万短信 1 小时发完，怎么设计线程池？</title>
      <link>https://seabrid.cn/posts/1000-wanduanxin-1-xiaoshifawanzenmeshejixianchengchi</link>
      <guid>https://seabrid.cn/posts/1000-wanduanxin-1-xiaoshifawanzenmeshejixianchengchi</guid>
      <description>设计一个能在一小时内稳定发送一千万条短信的线程池，绝不仅仅是设置几个参数那么简单。这是一个典型的**高并发、IO密集型**任务，需要从架构层面进行系统性设计，以确保高性能、高可靠和系统稳定。 以下是完整的设计方案： ### 🎯 核心目标与约束 首先，明确我们的目标： * **总量**: 10,000,000 条短信 * **时限**: 1 小时 (3600 秒) * **平均速率**: `10,000,000 / 3600 ≈ 2778` 条/秒 这意味着我们的系统需要稳定地维持近 2800 QPS 的发送能力。 ### 🛠️ 线程池核心配置 在生产环境中，严禁使用 `Executors.newFixedThreadPool()` 等方式创建线程池，因为它们使用无界队列，在海量任务下极易导致内存溢出（OOM）。我们必须手动创建 `ThreadPoolExecutor` 并进行精细化配置...</description>
      <pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Tailwind CSS 完整字典/速查表（前端开发常用）</title>
      <link>https://seabrid.cn/posts/tailwind-css-wanzhengzidiansuchabiaoqianduankaifachangyong</link>
      <guid>https://seabrid.cn/posts/tailwind-css-wanzhengzidiansuchabiaoqianduankaifachangyong</guid>
      <description>## 📐 布局 Layout | 类别 | 常用类 | 说明 | |:---|:---|:---| | **容器** | `container` `mx-auto` `px-4` | 居中容器 | | **显示** | `block` `inline` `inline-block` `hidden` `flex` `grid` `table` | 显示模式 | | **定位** | `static` `relative` `absolute` `fixed` `sticky` | 定位方式 | | **层级** | `z-0` ~ `z-50` | z-index | --- ## 📊 Flexbox 弹性布局 | 属性 | 类名 | 示例 | |:---|:---|:---| | 方向 | `flex-row` `flex-col` `flex-row-reverse` | 主轴方向...</description>
      <pubDate>Wed, 08 Apr 2026 11:14:02 GMT</pubDate>
    </item>
    <item>
      <title>Vue 3 异步请求控制：串行与并行的优雅实践</title>
      <link>https://seabrid.cn/posts/vue-3-yibuqingqiukongzhichuanxingyubingxingdeyouyashijian</link>
      <guid>https://seabrid.cn/posts/vue-3-yibuqingqiukongzhichuanxingyubingxingdeyouyashijian</guid>
      <description>在 Vue 3 的开发中，处理异步请求是家常便饭。我们经常遇到这样的场景：需要等待一个或多个 API 请求完成后，才能进行下一步的数据处理或页面渲染。如何清晰、高效地控制这些请求的执行顺序，是构建健壮应用的关键。 本文将探讨在 Vue 3 中控制异步请求的两种核心模式：**串行执行**和**并行执行**，并结合 `async/await`、`Promise.all` 等现代 JavaScript 特性，提供清晰、可维护的解决方案。 #### 🎯 场景一：串行执行，处理请求依赖 当一个请求的执行依赖于前一个请求的返回结果时，我们必须确保它们按顺序执行。例如，先获取用户 ID，再根据 ID 获取用户的详细信息和订单列表。 在 Vue 3 的 ` 加载中...</description>
      <pubDate>Fri, 03 Apr 2026 17:34:26 GMT</pubDate>
    </item>
    <item>
      <title>SQL 性能避坑：为什么阿里强制禁用 ORDER BY RAND()？</title>
      <link>https://seabrid.cn/posts/sql-xingnengbikengweishenmealiqiangzhijinyong-order-by-rand</link>
      <guid>https://seabrid.cn/posts/sql-xingnengbikengweishenmealiqiangzhijinyong-order-by-rand</guid>
      <description>在阿里巴巴的《Java 开发手册》及众多高并发系统的数据库规范中，**`ORDER BY RAND()`** 被列为**强制禁止**的写法。这并非因为语法错误，而是因为它在数据量稍大时，会引发严重的性能问题，甚至导致数据库雪崩。 以下是其被禁用的核心原因、底层机制分析及推荐的替代方案： ### 1. 核心痛点：为什么 `ORDER BY RAND()` 是“性能毒药”？ 当执行 `SELECT * FROM table_name ORDER BY RAND() LIMIT N;` 时，MySQL 的执行过程极其低效，主要包含以下三个致命步骤： 1. **全表扫描与逐行计算**： MySQL 必须扫描表中的**每一行数据**，并为每一行调用一次 `RAND()` 函数生成一个随机数。这意味着即使你只需要 1 条数据，如果表里有 100 万行，它也要计算 100 万次随机数。 2.</description>
      <pubDate>Mon, 23 Mar 2026 11:27:10 GMT</pubDate>
    </item>
    <item>
      <title>HashMap 是不是线程安全的？如果让你来实现一个线程安全的 HashMap 你要怎么设计？如果不用加锁你要怎么设计？</title>
      <link>https://seabrid.cn/posts/hashmap-shibushixianchenganquanderuguorangnilaishixianyigexianchenganquande-hashmap-niyaozenmeshejiruguobuyongjiasuoniyaozenmesheji</link>
      <guid>https://seabrid.cn/posts/hashmap-shibushixianchenganquanderuguorangnilaishixianyigexianchenganquande-hashmap-niyaozenmeshejiruguobuyongjiasuoniyaozenmesheji</guid>
      <description>HashMap 的线程安全性是多线程编程中的一个重要问题，下面我将为你详细解答，并探讨线程安全 HashMap 的设计方案。 # 🔒 HashMap 的线程安全性分析 ## HashMap 的非线程安全本质 HashMap 在设计上**不是线程安全**的。当多个线程同时访问和修改同一个 HashMap 实例时，会导致不可预知的行为。 ### 并发环境下的主要问题： - **数据竞争**：多个线程同时执行 put/remove 操作可能导致数据丢失或覆盖 - **死循环**：在扩容过程中，多线程可能导致链表形成环，引发 CPU 100% 问题 - **大小不一致**：size() 方法返回的结果可能不准确 ### 特例分析 需要注意的是，当 HashMap 作为**方法内的局部变量**，且每个线程拥有独立实例时，不存在线程安全问题。 # 🛠️ 实现线程安全 HashMap 的设计方案 #...</description>
      <pubDate>Tue, 13 Jan 2026 11:18:25 GMT</pubDate>
    </item>
    <item>
      <title>Trie树介绍</title>
      <link>https://seabrid.cn/posts/trieshujieshao</link>
      <guid>https://seabrid.cn/posts/trieshujieshao</guid>
      <description>### 🌲 Trie树的核心特性 Trie树有三个基本性质： 1. **根节点不包含字符**，它作为所有字符串的起点。 2. 从根节点到任意一个节点的路径上，经过的所有字符连接起来，就是该节点对应的字符串（或前缀）。 3. 每个节点的所有子节点所包含的字符都互不相同。 它的核心思想是 **空间换时间**，通过将字符串的公共前缀合并存储，避免了大量无谓的字符串比较，使得查询效率在很多情况下优于哈希表。 ### 🧱 结构与基本操作 一个典型的Trie树节点（TrieNode）通常包含两部分信息： * **子节点指针**：可以是固定大小的数组（如处理26个小写英文字母时使用长度为26的数组）或更灵活的映射（如`Map`），用于指向下一个字符节点。 * **结束标记**：一个布尔值（如`isEndOfWord`），标记从根节点到当前节点的路径是否构成了一个完整的单词（而不仅仅是前缀）。...</description>
      <pubDate>Tue, 13 Jan 2026 09:20:39 GMT</pubDate>
    </item>
    <item>
      <title>评论脏词过滤：基于DFA算法的高性能动态过滤方案</title>
      <link>https://seabrid.cn/posts/pinglunzangciguolujiyudfasuanfadegaoxingnengdongtaiguolufangan</link>
      <guid>https://seabrid.cn/posts/pinglunzangciguolujiyudfasuanfadegaoxingnengdongtaiguolufangan</guid>
      <description>评论系统是内容平台和社交应用的核心功能之一，而脏词过滤是保障内容安全、维护社区氛围的关键技术。本文将详细介绍如何在SpringBoot中实现一个**高性能、支持动态更新**的脏词过滤系统。 ## 一、背景与需求分析 随着Web应用的发展，用户生成内容（UGC）面临着严峻的内容安全挑战。脏词过滤系统需要满足以下核心需求： - **高性能**：处理海量用户评论时不能成为系统瓶颈 - **动态更新**：脏词库需要支持实时更新，无需重启服务 - **准确性**：准确识别敏感词，同时控制误判率 - **灵活性**：支持多种处理策略（替换、拒绝、审核） ## 二、核心技术选型：为何选择DFA算法？ 在脏词过滤场景下，**DFA（确定有限状态自动机）算法**相比传统方法有显著优势。 ### 2.1 传统方法的瓶颈 - **暴力匹配**：遍历每个脏词检查文本是否包含，时间复杂度O(n*m)，随脏词数量增加...</description>
      <pubDate>Tue, 13 Jan 2026 09:02:35 GMT</pubDate>
    </item>
    <item>
      <title>MySQL如何解决深度分页问题？</title>
      <link>https://seabrid.cn/posts/mysqlruhejiejueshendufenyewenti</link>
      <guid>https://seabrid.cn/posts/mysqlruhejiejueshendufenyewenti</guid>
      <description>在MySQL开发中，除了计数场景，深度分页（即`LIMIT offset, size`中`offset`值极大的分页查询）也是高频遇到的性能问题。比如“查询第1000页数据，每页10条”（`LIMIT 9990, 10`），常会出现查询缓慢的情况。下面详细讲解深度分页的问题根源及解决方案。 ### 1. 深度分页的问题根源 先明确常规分页的实现方式：使用`LIMIT offset, size`，其中`offset`表示跳过前N条数据，`size`表示取N条数据。 问题核心：当`offset`极大时（如9990），MySQL需要先扫描并跳过前9990条数据，再取10条数据。即使查询条件有索引，也需要遍历索引到第9990条位置，才能定位到目标数据，导致IO开销大、查询效率低。 示例（低效查询）： ```sql -- 查询第1000页数据，每页10条，offset=9990 SELECT id,...</description>
      <pubDate>Thu, 08 Jan 2026 09:27:51 GMT</pubDate>
    </item>
    <item>
      <title>MySQL中count(*)、count(1)与count(字段名)的区别详解？</title>
      <link>https://seabrid.cn/posts/mysqlzhongcountcount1yucountziduanmingdequbiexiangjie</link>
      <guid>https://seabrid.cn/posts/mysqlzhongcountcount1yucountziduanmingdequbiexiangjie</guid>
      <description>在MySQL开发中，计数是高频操作，而`count(*)`、`count(1)`和`count(字段名)`这三种常见的计数方式，常常让开发者混淆——它们的计数结果是否一致？执行效率有差异吗？该如何选择？本文将从核心逻辑、具体区别、效率对比、实践建议四个维度，彻底讲清三者的差异，帮你避开使用误区。 ## 一、先明确核心：count()函数的本质 首先要厘清一个基础认知：`count()`是MySQL的聚合函数，核心作用是**统计查询结果集中符合条件的行数**。三者的差异根源，在于「统计范围」和「MySQL对其的优化逻辑」不同，而非函数本身的功能差异。 ## 二、三者的具体区别：逻辑+示例验证 为了更直观地对比，我们先创建一张测试表并插入测试数据（包含NULL值，模拟真实业务场景）： ```sql -- 创建测试表 CREATE TABLE test_count ( id INT COMMEN...</description>
      <pubDate>Thu, 08 Jan 2026 09:23:26 GMT</pubDate>
    </item>
    <item>
      <title>二分查找的两种核心类型：精准查找与近似查找（Java实现与场景分析）</title>
      <link>https://seabrid.cn/posts/erfenchazhaodeliangzhonghexinleixingjingzhunchazhaoyujinsichazhaojavashixianyuchangjingfenxi</link>
      <guid>https://seabrid.cn/posts/erfenchazhaodeliangzhonghexinleixingjingzhunchazhaoyujinsichazhaojavashixianyuchangjingfenxi</guid>
      <description># 二分查找的两种核心类型：精准查找与近似查找（Java实现与场景分析） ## 前言 二分查找（Binary Search）作为有序数组的高效查找算法，其时间复杂度为O(log n)，远优于线性查找的O(n)。根据查找需求的不同，二分查找可分为两大核心类型：**精准查找**与**近似查找**。精准查找是二分查找的原始形态，专注于判断目标值是否存在并返回其精确索引；近似查找则是精准查找的扩展，用于在目标值不存在时，找到与目标值最接近的元素，满足实际业务中的模糊匹配需求。本文将详细讲解这两种查找类型的原理、Java实现及适用场景。 ## 一、 精准查找（Exact Binary Search） ### 1.</description>
      <pubDate>Mon, 05 Jan 2026 14:36:49 GMT</pubDate>
    </item>
    <item>
      <title>Vue3 应用版本更新策略：实现浏览器自动加载最新内容</title>
      <link>https://seabrid.cn/posts/vue3-yingyongbanbengengxincelueshixianliulanqizidongjiazaizuixinneirong</link>
      <guid>https://seabrid.cn/posts/vue3-yingyongbanbengengxincelueshixianliulanqizidongjiazaizuixinneirong</guid>
      <description>本文将详细介绍如何在 Vue3 应用中实现版本更新后浏览器自动加载最新内容的完整方案，涵盖构建优化、缓存策略与版本控制的各个方面。 ## 1. 构建工具配置：静态资源哈希命名 在 Vue3 项目中，使用 Vite 或 Webpack 等构建工具为静态资源生成带哈希值的文件名是版本控制的基础。当文件内容变化时，哈希值会更新，浏览器会因 URL 不同而重新加载资源。 ### Vite 配置示例 ```js // vite.config.js export default defineConfig({ build: { rollupOptions: { output: { entryFileNames: `assets/[name]-[hash].js`, chunkFileNames: `assets/[name]-[hash].js`, assetFileNames:...</description>
      <pubDate>Mon, 05 Jan 2026 14:11:51 GMT</pubDate>
    </item>
    <item>
      <title>二分查找算法和实例介绍</title>
      <link>https://seabrid.cn/posts/erfenchazhaosuanfaheshilijieshao</link>
      <guid>https://seabrid.cn/posts/erfenchazhaosuanfaheshilijieshao</guid>
      <description>### **1. 核心思想** 二分算法是一种高效的搜索算法，适用于**有序数组**，通过**分治策略**逐步缩小搜索范围。其核心思想是： - 将数组分为两半，比较目标值与中间元素的大小关系； - 根据比较结果，决定继续在左半部分或右半部分搜索； - 重复此过程，直到找到目标值或确定其不存在。 --- ### **2. 使用前提** - **数组必须有序**（升序或降序）。 - 适用于静态数据（无需频繁插入/删除），因动态数据维护有序性成本较高。 --- ### **3. 算法步骤** 以升序数组为例，查找目标值 `target`： 1. **初始化**：定义两个指针 `low`（起始位置）和 `high`（结束位置）。 - 通常 `low = 0`，`high = 数组长度 - 1`。 2. **循环条件**：当 `low &lt;= high` 时继续循环。 3.</description>
      <pubDate>Mon, 05 Jan 2026 11:54:36 GMT</pubDate>
    </item>
    <item>
      <title>场景面试题：如何避免用户重复下单（多次下单未支付，占用库存）</title>
      <link>https://seabrid.cn/posts/changjingmianshitiruhebimianyonghuzhongfuxiadanduocixiadanweizhifuzhanyongkucun</link>
      <guid>https://seabrid.cn/posts/changjingmianshitiruhebimianyonghuzhongfuxiadanduocixiadanweizhifuzhanyongkucun</guid>
      <description># Spring Boot 如何避免用户重复下单（多次下单未支付，占用库存）？—— 面试题详解 在高并发电商系统中，一个常见的问题是：**用户短时间内多次点击“下单”按钮，生成多个未支付订单，导致库存被无效占用，影响其他用户购买**。这不仅浪费系统资源，还可能引发超卖或库存不足的问题。 本文将围绕 **Spring Boot 技术栈**，从原理、方案设计到代码实现，详细讲解如何有效防止用户重复下单，并形成一套可落地的解决方案。 --- ## 一、问题场景还原（面试题背景） &gt; **面试官提问**： &gt; “在我们的电商平台中，经常有用户在未支付的情况下多次点击下单按钮，造成多个待支付订单和库存锁定。请问你如何在 Spring Boot 项目中解决这个问题？” 这是一个典型的 **幂等性 + 库存管理 + 分布式锁** 综合问题。 --- ## 二、核心思路分析 要解决重复下单问题，需从以下维...</description>
      <pubDate>Mon, 29 Dec 2025 21:20:52 GMT</pubDate>
    </item>
    <item>
      <title>什么是 Netty，它在网络编程中解决了什么问题？</title>
      <link>https://seabrid.cn/posts/shenmeshi-nettytazaiwangluobianchengzhongjiejueleshenmewenti</link>
      <guid>https://seabrid.cn/posts/shenmeshi-nettytazaiwangluobianchengzhongjiejueleshenmewenti</guid>
      <description>Netty 是一个高性能、异步事件驱动的网络应用框架，用于快速开发可维护的高性能协议服务器和客户端。它由 JBoss（现为 Red Hat 的一部分）开发，并广泛应用于 Java 生态系统中，是构建高并发、低延迟网络应用的重要工具。 --- ## 一、Netty 是什么？ Netty 是基于 Java NIO（Non-blocking I/O）封装而成的网络编程框架。它屏蔽了 Java 原生 NIO 编程的复杂性，提供了更简洁、更安全、更高效的 API，使得开发者可以专注于业务逻辑，而无需处理底层网络通信细节。 核心特点包括： - **异步非阻塞**：基于事件驱动模型，支持高并发连接。 - **高性能**：通过零拷贝、内存池、高效的线程模型等优化手段提升性能。 - **可扩展性强**：模块化设计，支持自定义协议、编解码器、处理器等。 - **稳定性高**：经过大量生产环境验证（如阿里巴巴、...</description>
      <pubDate>Mon, 29 Dec 2025 21:11:25 GMT</pubDate>
    </item>
    <item>
      <title>Spring Boot中.properties和.yml 的配置文件区别是什么？</title>
      <link>https://seabrid.cn/posts/spring-bootzhongpropertiesheyml-depeizhiwenjianqubieshishenme</link>
      <guid>https://seabrid.cn/posts/spring-bootzhongpropertiesheyml-depeizhiwenjianqubieshishenme</guid>
      <description>在 Spring Boot 中，`application.properties` 和 `application.yml` 都是用来配置应用程序属性的配置文件，它们的功能是等价的，只是语法格式不同。以下是两者的主要区别： --- ### 1. **语法格式不同** - **`application.properties`** 使用键值对的形式（类似 Java 的 Properties 文件）： ```properties server.port=8080 spring.datasource.url=jdbc:mysql://localhost:3306/mydb ``` - **`application.yml`** 使用 YAML（YAML Ain't Markup Language）格式，基于缩进表示层级结构： ```yaml server: port: 8080 spring:...</description>
      <pubDate>Sun, 28 Dec 2025 21:50:45 GMT</pubDate>
    </item>
    <item>
      <title>什么是 Spring Actuator？它有什么优势？</title>
      <link>https://seabrid.cn/posts/shenmeshi-spring-actuatortayoushenmeyoushi</link>
      <guid>https://seabrid.cn/posts/shenmeshi-spring-actuatortayoushenmeyoushi</guid>
      <description>Spring Boot Actuator 是 Spring Boot 提供的一个用于监控和管理应用程序的模块。它通过暴露一系列 HTTP 端点（endpoints）或 JMX 接口，让开发者和运维人员可以轻松地获取应用的运行时状态、健康状况、指标信息、配置详情等，而无需自己编写额外的监控代码。 --- ### 一、Spring Actuator 的核心功能 1. **健康检查（Health）** - 检查应用及其依赖（如数据库、Redis、外部服务）是否正常。 - 默认路径：`/actuator/health` 2. **应用信息（Info）** - 显示应用的基本信息，如版本、构建时间、Git 提交信息等。 - 默认路径：`/actuator/info` 3.</description>
      <pubDate>Sun, 28 Dec 2025 21:39:10 GMT</pubDate>
    </item>
    <item>
      <title>Spring Boot @Async 注解失效原因分析</title>
      <link>https://seabrid.cn/posts/spring-boot-async-zhujieshixiaoyuanyinfenxi</link>
      <guid>https://seabrid.cn/posts/spring-boot-async-zhujieshixiaoyuanyinfenxi</guid>
      <description>@Async 是 Spring 提供的一个核心注解，用于将方法调用变为异步执行。它依赖 Spring 的 AOP（面向切面编程）机制来实现。当你在一个方法上加上 @Async 时，Spring 会在运行时为该方法所在的 Bean 创建一个代理对象。所有对该方法的外部调用，实际上都是调用这个代理对象，由代理对象负责将方法的执行提交给一个线程池，从而实现异步效果。 基于这个原理，我们可以总结出 @Async 失效的几种典型场景。 --- 1. 调用者与被调用者在同一个类中（同类方法自调用） 这是 最常见 的失效场景。 原因： Spring 的 AOP 是基于代理实现的。只有通过 Spring 容器获取到的 Bean（即代理对象）去调用 @Async 方法时，AOP 切面才能生效。如果在同一个类的内部，一个方法直接调用另一个被 @Async 标注的方法，这个调用是对象内部的直接方法调用，没有经过...</description>
      <pubDate>Sat, 27 Dec 2025 23:07:45 GMT</pubDate>
    </item>
  </channel>
</rss>