Spring Boot自动配置原理是什么?

2025年 阅读约 10 分钟 面试指南 · Spring Boot面试

深入解析Spring Boot自动配置原理,从@SpringBootApplication注解到spring.factories加载机制,附条件装配实战。

一句话总结

Spring Boot自动配置通过@SpringBootApplication → @EnableAutoConfiguration → spring.factories加载配置类,再通过@Conditional注解按需装配。核心是约定优于配置,减少手动配置。

初级理解

核心注解与机制:

@SpringBootApplication = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan @EnableAutoConfiguration:开启自动配置 → @Import(AutoConfigurationImportSelector.class) 导入配置 → 读取 META-INF/spring.factories(或 AutoConfiguration.imports)

条件装配(@Conditional):

• @ConditionalOnClass:类路径下存在指定类时才生效 • @ConditionalOnMissingBean:容器中不存在指定Bean时才生效(防止用户自定义被覆盖) • @ConditionalOnProperty:配置属性满足条件时才生效
一句话总结:@SpringBootApplication → 读spring.factories → @Conditional按需装配。

中级深入

自动配置流程详解:

1. 启动类加载 → 触发@EnableAutoConfiguration 2. AutoConfigurationImportSelector读取配置文件 3. 获取候选自动配置类(如DataSourceAutoConfiguration) 4. 根据@Conditional进行条件过滤 5. 将符合条件的配置类注册到Spring容器 6. 完成默认属性的装配

spring.factories示例:

# META-INF/spring.factories org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.redis.RedisAutoConfiguration
注意:Spring Boot 2.7+开始使用META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports替代spring.factories。

高级拓展

自定义Starter中的自动配置:

@Configuration @ConditionalOnClass(MyService.class) @EnableConfigurationProperties(MyProperties.class) public class MyAutoConfiguration { @Bean @ConditionalOnMissingBean public MyService myService(MyProperties properties) { return new MyService(properties.getEndpoint()); } }

排除自动配置:

// 方式1:注解排除 @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) // 方式2:配置排除 spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
面试加分项:能说出spring.factories加载机制、@Conditional家族注解、Spring Boot 2.7+的变化,说明你对自动配置有深入理解。

实战场景

场景:自定义Starter自动配置

// 1. 创建配置属性类 @ConfigurationProperties(prefix = "my.service") public class MyProperties { private String endpoint; private int timeout = 3000; } // 2. 创建自动配置类 @Configuration @ConditionalOnClass(MyService.class) @EnableConfigurationProperties(MyProperties.class) public class MyAutoConfiguration { @Bean @ConditionalOnMissingBean public MyService myService(MyProperties properties) { return new MyService(properties.getEndpoint(), properties.getTimeout()); } } // 3. 注册到spring.factories # META-INF/spring.factories org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.MyAutoConfiguration

面试模拟

Q:Spring Boot自动配置的原理是什么?

A:核心流程:1. @SpringBootApplication包含@EnableAutoConfiguration;2. 通过@Import导入AutoConfigurationImportSelector;3. 读取META-INF/spring.factories获取候选配置类;4. 根据@Conditional注解按需过滤;5. 将符合条件的配置类注册到容器。

Q:@ConditionalOnMissingBean有什么作用?

A:@ConditionalOnMissingBean表示只有当容器中不存在指定类型的Bean时才生效。这样用户可以自定义Bean来覆盖默认配置,体现了Spring Boot"约定优于配置"的设计理念。