闪电疯狂赛车
91.44M · 2026-03-23
Spring Boot 是目前 Java 企业级开发中最流行的框架之一,它基于 Spring 框架,通过自动配置、起步依赖和嵌入式服务器等设计,极大地简化了 Spring 应用的搭建和开发过程。下面从背景、核心特性、启动流程、自动配置原理、与 Spring 的关系以及最佳实践等方面进行详细讲解。
在 Spring Boot 出现之前,使用 Spring 开发一个 Web 应用通常需要:
DispatcherServlet、视图解析器、数据源、事务管理器)。这些工作重复、繁琐,且容易出错。Spring Boot 的目标正是让 Spring 应用“开箱即用” ,让开发者能够专注于业务逻辑。
spring-boot-starter-web 包含了 spring-webmvc、tomcat-embed-core、jackson 等。@EnableAutoConfiguration 或 @SpringBootApplication 注解。spring.factories 文件加载配置类,并结合条件注解(如 @ConditionalOnClass)决定是否生效。java -jar 启动。ServletWebServerFactory 和 ServletWebServerApplicationContext 在容器启动时创建并启动内嵌服务器。application.properties / application.yml、命令行参数、环境变量、系统属性等。@Value 或 @ConfigurationProperties 将配置注入到 Bean 中。/health、/info、/metrics、/env,用于监控和管理应用。spring-boot-starter-actuator 后自动配置,可通过 management.endpoints.web.exposure.include 控制暴露的端点。@SpringBootTest 等注解,简化集成测试。一个典型的 Spring Boot 应用入口:
java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
SpringApplication.run() 做了什么?创建 SpringApplication 实例
META-INF/spring.factories 中的 ApplicationContextInitializer 和 ApplicationListener。main 方法所在的类)。执行 run 方法
StopWatch。Headless 属性。SpringApplicationRunListeners。Environment),加载配置文件。ApplicationContext(根据应用类型创建 AnnotationConfigServletWebServerApplicationContext 等)。prepareContext,初始化上下文,注册 BeanDefinition。refresh(),此步与 Spring 的 IoC 容器启动相同)。refresh() 的 onRefresh() 中触发)。ApplicationStartedEvent 等事件。ApplicationRunner 和 CommandLineRunner。java
// SpringApplication.run 主要流程
public ConfigurableApplicationContext run(String... args) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
// ...
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
// ...
ConfigurableApplicationContext context = createApplicationContext();
prepareContext(context, environment, listeners, applicationArguments, printedBanner);
refreshContext(context);
afterRefresh(context, applicationArguments);
stopWatch.stop();
// ...
return context;
}
refreshContext 内部调用 AbstractApplicationContext.refresh(),该过程与 Spring IoC 容器启动完全一致(包括 invokeBeanFactoryPostProcessors、registerBeanPostProcessors、finishBeanFactoryInitialization 等)。refresh() 的 onRefresh() 阶段,通过 ServletWebServerApplicationContext 的 createWebServer() 实现。@EnableAutoConfiguration@SpringBootApplication 包含了 @EnableAutoConfiguration,后者通过 @Import(AutoConfigurationImportSelector.class) 导入一个选择器。
AutoConfigurationImportSelectorselectImports 方法会从 META-INF/spring.factories 文件中读取所有 EnableAutoConfiguration 键对应的全限定类名。DataSourceAutoConfiguration、WebMvcAutoConfiguration 等。每个自动配置类上都标注了多个条件注解,只有当所有条件满足时,该类才会被加载。常见条件注解:
@ConditionalOnClass:classpath 中存在指定的类。@ConditionalOnMissingBean:容器中不存在指定的 Bean。@ConditionalOnProperty:配置属性满足指定值。@ConditionalOnWebApplication:当前应用是 Web 应用。例如,DataSourceAutoConfiguration 的部分代码:
java
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory")
@EnableConfigurationProperties(DataSourceProperties.class)
@Import(DataSourcePoolMetadataProvidersConfiguration.class)
public class DataSourceAutoConfiguration {
// ...
}
自动配置类中通常通过 @EnableConfigurationProperties 引入 @ConfigurationProperties 类(如 DataSourceProperties),该类通过 @ConfigurationProperties(prefix = "spring.datasource") 将 application.properties 中的配置绑定到字段上。
开发者也可以编写自己的自动配置类,并将其添加到 META-INF/spring.factories 中。Spring Boot 会将其作为候选配置处理。
@SpringBootApplication 作为主类,它会自动开启组件扫描和自动配置。@ConfigurationProperties,将配置集中管理,避免 @Value 散落各处。application-{profile}.yml 分离配置。Spring Boot 的核心价值可以概括为: “约定大于配置,快速开发,生产就绪” 。它通过起步依赖简化依赖管理,通过自动配置消除样板代码,通过嵌入式服务器简化部署,并通过 Actuator 提供监控能力。
在实现上,Spring Boot 充分利用了 Spring 框架的扩展点(如 BeanFactoryPostProcessor、BeanPostProcessor、ApplicationContextInitializer),并结合了 SPI 机制(spring.factories)和丰富的条件注解,实现了高度智能化的自动配置。掌握 Spring Boot 的原理,不仅能帮助我们更高效地开发,也能在遇到问题时快速定位和解决。