1. 概述

Spring Boot 的自动配置机制会根据项目依赖,自动完成大部分配置工作。虽然这种“约定优于配置”的方式大大简化了开发流程,但有时候我们也会好奇:Spring Boot 到底帮我们做了哪些配置?为什么有些组件被加载了,有些却没有?

这篇文章就来介绍一个非常实用的调试技巧:如何在应用启动时输出 Spring Boot 的自动配置报告(Auto-Configuration Report)。通过这份报告,我们可以清楚地看到哪些配置类被应用了、哪些没有被应用,以及背后的原因。

2. 示例应用

我们先准备一个最简单的 Spring Boot 应用作为演示:

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

这个应用啥也没干,但它足以触发 Spring Boot 的自动配置逻辑。

3. 通过 application.properties 启用报告

默认情况下,Spring Boot 启动时不会输出自动配置报告。但我们可以通过在 application.properties 中设置 debug=true 来开启调试模式

debug=true

或者,如果你用的是 application.yml,可以这样写:

debug: true

✅ 简单粗暴,一行搞定。

4. 通过命令行参数启用报告

如果你不想改配置文件,也可以在启动应用时加上 --debug 参数

$ java -jar myproject-0.0.1-SNAPSHOT.jar --debug

这个方式在排查临时问题时特别有用,尤其是在 CI/CD 环境中。

5. 报告内容解读

开启调试模式后,控制台会输出一份详细的自动配置报告。这份报告分为两部分:

✅ Positive matches(匹配成功的配置)

这部分列出了 Spring Boot 成功加载的自动配置类,以及它们被加载的原因。

例如:

AopAutoConfiguration matched:
   - @ConditionalOnClass found required classes 'org.springframework.context.annotation.EnableAspectJAutoProxy', 
     'org.aspectj.lang.annotation.Aspect', 'org.aspectj.lang.reflect.Advice', 'org.aspectj.weaver.AnnotatedElement'; 
     @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)

说明:因为 classpath 中存在 AspectJ 相关类,所以 AOP 自动配置生效了。

❌ Negative matches(未匹配的配置)

这部分列出了 Spring Boot 尝试加载但最终放弃的配置类,以及未加载的原因。

例如:

ActiveMQAutoConfiguration:
   Did not match:
      - @ConditionalOnClass did not find required classes 'javax.jms.ConnectionFactory', 
        'org.apache.activemq.ActiveMQConnectionFactory' (OnClassCondition)

说明:由于 classpath 中缺少 ActiveMQ 相关依赖,所以这个配置类没有被加载。

⚠️ 这部分信息非常有用,尤其是在你发现某个组件“怎么没生效”时,可以快速定位是不是因为缺少依赖或者配置不当。

完整输出示例:

============================
CONDITIONS EVALUATION REPORT
============================


Positive matches:
-----------------

   AopAutoConfiguration matched:
      - @ConditionalOnClass found required classes 'org.springframework.context.annotation.EnableAspectJAutoProxy', 
        'org.aspectj.lang.annotation.Aspect', 'org.aspectj.lang.reflect.Advice', 'org.aspectj.weaver.AnnotatedElement'; 
        @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)
      - @ConditionalOnProperty (spring.aop.auto=true) matched (OnPropertyCondition)

   AopAutoConfiguration.CglibAutoProxyConfiguration matched:
      - @ConditionalOnProperty (spring.aop.proxy-target-class=true) matched (OnPropertyCondition)

   AuditAutoConfiguration#auditListener matched:
      - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.audit.listener.AbstractAuditListener; 
        SearchStrategy: all) did not find any beans (OnBeanCondition)

   AuditAutoConfiguration.AuditEventRepositoryConfiguration matched:
      - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.audit.AuditEventRepository; 
        SearchStrategy: all) did not find any beans (OnBeanCondition)

   AuditEventsEndpointAutoConfiguration#auditEventsEndpoint matched:
      - @ConditionalOnBean (types: org.springframework.boot.actuate.audit.AuditEventRepository; 
        SearchStrategy: all) found bean 'auditEventRepository'; 
        @ConditionalOnMissingBean (types: org.springframework.boot.actuate.audit.AuditEventsEndpoint; 
        SearchStrategy: all) did not find any beans (OnBeanCondition)
      - @ConditionalOnEnabledEndpoint no property management.endpoint.auditevents.enabled found 
        so using endpoint default (OnEnabledEndpointCondition)


Negative matches:
-----------------

   ActiveMQAutoConfiguration:
      Did not match:
         - @ConditionalOnClass did not find required classes 'javax.jms.ConnectionFactory', 
           'org.apache.activemq.ActiveMQConnectionFactory' (OnClassCondition)

   AopAutoConfiguration.JdkDynamicAutoProxyConfiguration:
      Did not match:
         - @ConditionalOnProperty (spring.aop.proxy-target-class=false) did not find property 
           'proxy-target-class' (OnPropertyCondition)

   ArtemisAutoConfiguration:
      Did not match:
         - @ConditionalOnClass did not find required classes 'javax.jms.ConnectionFactory', 
           'org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory' (OnClassCondition)

   AtlasMetricsExportAutoConfiguration:
      Did not match:
         - @ConditionalOnClass did not find required class 'io.micrometer.atlas.AtlasMeterRegistry' 
           (OnClassCondition)

   AtomikosJtaConfiguration:
      Did not match:
         - @ConditionalOnClass did not find required class 'com.atomikos.icatch.jta.UserTransactionManager' 
           (OnClassCondition)

6. 总结

通过启用 debug=true 或使用 --debug 参数,我们可以轻松获取 Spring Boot 的自动配置报告。这个功能在调试配置类加载问题时非常实用,尤其是在排查“为什么某个组件没生效”时,能节省大量时间。

源码示例可参考:GitHub 项目地址


原始标题:Display Auto-Configuration Report in Spring Boot