FailureAnalyzer 仅用于 Spring Boot 启动失败阶段的特定异常分析,不处理运行时 HTTP 或业务异常;需继承 AbstractFailureAnalyzer、精确识别异常、返回 FailureAnalysis 并在 spring.factories 中注册。

Spring Boot 的 FailureAnalyzer 不是用来“拦截并格式化输出”任意运行时异常的,它专用于应用启动失败阶段(即 SpringApplication.run() 执行过程中、上下文刷新前)的特定异常分析。它不介入容器运行后的 HTTP 请求或业务逻辑异常,也不做日志格式化——它的输出是控制台直接打印的诊断报告,不是日志框架(如 Logback)的格式化内容。
明确 FailureAnalyzer 的作用边界
它只在启动崩溃时生效,且仅处理 Spring Boot 内部抛出的、未被其他机制捕获的致命异常(如端口冲突、配置缺失、Bean 创建失败等)。它不会响应 Controller 层 500 错误、Filter 异常或线程池拒绝等运行期问题。所谓“一致性报错”,指的是对同类启动故障(比如所有 BindException)统一生成结构清晰、原因+建议分明的提示,而非统一日志样式。
自定义 FailureAnalyzer 的标准流程
核心是继承 AbstractFailureAnalyzer,聚焦异常类型识别与语义提炼:
- 声明要处理的异常类型(泛型参数),例如
AbstractFailureAnalyzer<BeanCreationException> - 重写
analyze()方法:先用instanceof精确判断是否为本类关注的异常;再逐层调用getCause()向下挖掘根因(如BeanCreationException套着SQLException) - 构造
FailureAnalysis对象:传入可读错误描述、详细原因、修复建议三部分;其中getAction()返回的建议必须具体可执行(如 “检查 application.yml 中 datasource.url 是否拼写正确”) - 确保
analyze()对不匹配异常返回null,否则会阻断后续 Analyzer(如内置的PortInUseFailureAnalyzer)的匹配机会
META-INF/spring.factories 注册不可少
自定义类写完后,必须在 src/main/resources/META-INF/spring.factories 中显式注册:
立即学习“Java免费学习笔记(深入)”;
org.springframework.boot.diagnostics.FailureAnalyzer=\ com.yourpackage.YourCustomFailureAnalyzer注意反斜杠换行和等号后无空格;若多个 Analyzer,用逗号分隔。Spring Boot 启动时通过 SpringFactoriesLoader 加载该文件,完成自动装配。
避开常见陷阱
很多自定义 Analyzer 在实际项目中失效,往往因为:
- 试图分析日志初始化失败(如
logback-spring.xml语法错误)——此时LoggerContext已损坏,连LoggingFailureAnalyzer都可能抛 NPE,你的 Analyzer 更无法安全执行 - 在
analyze()中直接强转异常而没判空或类型,导致二次异常掩盖原始问题 - 依赖尚未初始化的 Bean(如注入
@Autowired服务),启动阶段上下文未就绪,必然空指针 - 误以为能“自动修复”——它只提供建议,不能改配置、杀进程、重连数据库


















