WireDoctor:Spring Boot 启动和 Bean 循环分析器


WireDoctor 是一个为 Spring Boot 应用设计的零侵入式运行时诊断与架构分析工具。它的核心理念是读取 Spring 应用启动后真实的、已解析的 ApplicationContext(应用上下文),并将其转化为一份互动式的诊断报告。

为什么选择 WireDoctor?

  • “为什么这项服务现在启动需要 40 秒?” ——Actuator 提供的是原始的 StartupStep JSON 数据;但没有人提供基于此的分析层。WireDoctor 会对运行缓慢的 bean 进行排序,计算关键路径,并告诉你哪个 @Lazy 最划算。
  • “我们更新了 Spring Boot,结果一个功能悄无声息地失效了。” ——自动配置不再匹配,直到生产环境才被发现。WireDoctor 会比较不同构建版本中 Spring Boot 的状态报告,并在持续集成 (CI) 过程中捕获 matched → notMatched 转变,并提供准确的故障信息。
  • “有人六个月前添加了一个 bean 循环,现在它承担了负载。” ——提交一个类似 lockfile 的架构基线;引入新循环的 PR 会在当天构建失败,而不是在重构时构建失败。
  • “这些豆子中哪些真的有用?” ——幽灵检测会交叉三个信号来查找那些会消耗启动时间和内存但没有使用迹象的豆子——诚实地标记,从不夸大其词。


核心功能

它主要帮你诊断以下几类常见问题:

  • 启动慢:不仅提供原始的 StartupStep JSON 数据,还会分析并排序哪些 Bean 拖慢了启动速度,计算出关键路径,并建议通过 @Lazy 优化哪个 Bean 收益最大。
  • 升级后出问题:Spring Boot 升级可能导致自动配置失效。WireDoctor 可以对比不同构建间的条件报告,在 CI 中捕获这种变化。
  • 循环依赖:它能检测出那些被 Spring 悄悄解决了的循环依赖,并通过 lazySuggestions 给出修复建议。
  • “僵尸”Bean:通过多种信号,识别出那些消耗启动时间和内存但看似未被使用的 Bean。
它提供的具体诊断能力包括:
  1. 交互式 HTML 报告:生成一个完全离线可用的 wiredoctor-report.html 文件,包含总览、依赖图、性能、条件等多个标签页。
  2. 真实启动耗时:提供每个 Bean 真实的实例化时间,而非估算。
  3. 解析后的依赖图:展示 Spring 实际注入的依赖关系,而非源码中的定义。
  4. 架构异味检测:识别高耦合(fan-in)、高扇出(fan-out)等风险点。
  5. 代理(Proxy)开销分析:统计 CGLIB/JDK 代理的数量,揭示隐藏的间接层。
它也能作为 CI 流水线中的“门禁”:
  • 架构回归门禁:基于基线文件,在 PR 中新增循环依赖时构建失败。
  • 升级门禁:检测 Spring Boot 升级后自动配置条件的变化。
  • 性能门禁:当启动时间出现显著回归或新增慢 Bean 时,构建失败。

快速开始

使用非常简单,添加依赖即可。运行后会在项目根目录生成 wiredoctor-report.html 和 wiredoctor-report.json 文件。

Maven:

<dependency>
    <groupId>io.github.ddsha441981</groupId>
    <artifactId>wiredoctor-autoconfigure</artifactId>
    <version>1.0.0</version>
</dependency>

Gradle:

implementation 'io.github.ddsha441981:wiredoctor-autoconfigure:1.0.0'

注意事项

项目明确指出了其局限性,体现了严谨的态度:

  • 不支持 GraalVM 原生镜像:在原生镜像中运行时会自动跳过分析。
  • “孤儿 Bean”是启发式结果:报告为“无依赖”的 Bean 不一定未被使用,可能通过 ApplicationContext.getBean() 等方式动态调用。
  • 检测的是“已解决”的循环依赖:对于导致应用崩溃的循环依赖,它无法报告。
  • 部分循环依赖可能漏报:通过 Spring 三级缓存解决的循环依赖可能无法被检测到