Spring Boot 自动配置机制
1. 自动配置是如何工作的?
Spring Boot 自动配置的核心在于 SPI 机制与条件注解的配合。启动时,@SpringBootApplication 包含 @EnableAutoConfiguration,它会扫描所有 JAR 包中的 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(2.7+)或旧版的 spring.factories。
读取到 EnableAutoConfiguration 对应的全限定类名后,Spring 容器会评估每个配置类上的 @ConditionalOn... 注解(如 @ConditionalOnClass)。只有满足条件的配置类才会生效,并通过 @Bean 方法向容器注册组件。这里有个关键点:用户自定义的 Bean 优先于自动配置,因为自动配置通常带有 @ConditionalOnMissingBean。如果需要控制顺序,可以使用 @AutoConfigureBefore/After。
Spring Boot 启动流程
2. 完整启动流程是怎样的?
从 main() 到 Web 容器启动,关键步骤如下:
- 执行 SpringApplication.run():创建实例并推断应用类型(SERVLET/REACTIVE/NONE)。
- 初始化监听器和初始器:加载
spring.factories中注册的ApplicationContextInitializer和ApplicationListener。 - 创建 ApplicationContext:根据类型创建
AnnotationConfigServletWebServerApplicationContext。 - 准备上下文:应用初始器,注册主配置类。
- 刷新上下文:调用
AbstractApplicationContext.refresh()。这是核心生命周期,包括执行BeanFactoryPostProcessor、扫描注册BeanDefinition、实例化非懒加载单例 Bean。 - 内嵌 Web 容器启动:
ServletWebServerFactoryAutoConfiguration生效,创建工厂并在refresh末尾启动 Tomcat。 - 发布事件:最后发布
ApplicationStartedEvent和ApplicationReadyEvent。
Starter 定制与扩展
3. 如何自定义 Starter?
Starter 结构通常分为依赖管理模块和自动配置逻辑模块。设计时要遵循分离原则,starter 只声明依赖,autoconfigure 模块包含实际逻辑。
在自动配置类中,务必使用条件注解来避免冲突。例如:
@Configuration
@ConditionalOnClass(MyService.class)
@ConditionalOnMissingBean(MyService.class)
public class MyServiceAutoConfiguration {
@Bean
MyService {
();
}
}


