springboot自动配置机制基于依赖、条件、配置类三者联动:通过@conditionalonclass等注解按需加载meta-inf/spring/org.springframework.boot.autoconfigure.autoconfiguration.imports中声明的配置类,支持application.yml属性覆盖、@bean替换及exclude禁用。

想在实际项目中快速理解并运用SpringBoot自动配置机制,而不是只停留在“@SpringBootApplication一加就跑”的模糊认知里,就得从依赖、条件、配置类三者联动的真实链条入手。你不需要先啃完所有源码,但必须亲手触发一次自动配置的加载、观察它生效的过程、再尝试覆盖它。
第一步:确认自动配置是否真的在工作
新建一个空SpringBoot项目(2.7.18或3.2.x),仅引入spring-boot-starter-web,启动后访问/actuator/autoconfig(需添加spring-boot-starter-actuator并配置management.endpoints.web.exposure.include=autoconfig)。页面会列出所有被匹配/跳过的自动配置类,比如WebMvcAutoConfiguration状态为matched,而HibernateJpaAutoConfiguration显示did not match——这说明自动配置不是全量加载,而是按条件筛选的。
这一步不能跳过。不看/actuator/autoconfig,你就永远不知道当前项目到底激活了哪些自动配置。
第二步:跟踪一个典型自动配置类的触发路径
以TomcatServletWebServerFactoryAutoConfiguration为例(负责内嵌Tomcat初始化):
① 查看META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,确认该类在列表中;
② 打开该类源码,发现它用@ConditionalOnClass(Servlet.class)和@ConditionalOnMissingBean(type = "org.springframework.boot.web.servlet.server.ServletWebServerFactory")双重校验;
③ 在项目中故意删掉spring-boot-starter-web依赖→重启→/actuator/autoconfig中该配置类变为did not match→说明@ConditionalOnClass失效;
④ 保留spring-boot-starter-web,但在启动类中手动@Bean定义一个ServletWebServerFactory实例→重启→该自动配置类状态变为skipped→验证@ConditionalOnMissingBean生效。
【关键点】自动配置不是“固定代码执行”,而是由classpath是否存在类、容器中是否已有Bean、application.yml中是否设置了server.port等条件实时决策的。
第三步:动手覆盖一个默认配置
方法一:用application.yml改端口
直接写server.port: 9090,启动后Tomcat监听9090——这是最轻量的覆盖,背后是ServerProperties类通过@ConfigurationProperties("server")绑定属性,TomcatServletWebServerFactory构造时读取该对象。
方法二:用@Bean替换自动配置的Bean
在任意@Configuration类中添加:
@Bean<br>public ServletWebServerFactory servletWebServerFactory() {<br> TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();<br> factory.setPort(9090);<br> return factory;<br>}
这个Bean会触发@ConditionalOnMissingBean失效,让TomcatServletWebServerFactoryAutoConfiguration跳过注册自己的Bean。
方法三:禁用特定自动配置
在@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})中排除——适用于你明确不需要某套功能(如项目纯HTTP无DB)且不想让相关条件判断拖慢启动速度的场景。
第四步:验证自定义Starter中的自动配置是否生效
创建一个名为spring-boot-starter-demo的模块,在其src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中写入你的配置类全限定名,例如com.example.demo.DemoAutoConfiguration;
在该配置类上标注@AutoConfiguration,内部用@Bean声明一个DemoService;
将此Starter作为依赖引入主项目→启动→用@Autowired DemoService注入测试;
若注入成功,说明你写的自动配置已被SpringBoot识别并执行;若失败,检查AutoConfiguration.imports路径是否正确、类是否在classpath下、是否漏加@AutoConfiguration注解。
【注意】SpringBoot 2.7+已弃用spring.factories,必须用AutoConfiguration.imports,写错路径或格式会导致自动配置完全静默失效,且无任何报错提示。











