一句话总结
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"约定优于配置"的设计理念。