Skip to content

Springboot启动流程

Spring Boot 启动流程概述

  • 定义
  • Spring Boot 是一个快速开发框架,简化了 Spring 应用的配置和部署。其启动流程涉及从运行 main 方法到应用完全初始化,自动完成依赖注入、配置加载、容器初始化等步骤。
  • 核心作用
  • 提供嵌入式服务器(如 Tomcat)、自动配置(Auto-Configuration)、依赖管理,快速启动 Spring 应用。
  • 核心点
  • Spring Boot 启动基于 SpringApplication 类,通过初始化、环境配置、容器创建和自动配置等步骤完成应用启动。

1. Spring Boot 启动流程

Spring Boot 应用的启动流程可以分为以下关键步骤:

(1) 创建 SpringApplication 实例

  • 触发点
  • 运行 main 方法,调用 SpringApplication.run()
  • 示例: java @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
  • 过程
  • 初始化 SpringApplication 对象,设置:
    • 资源加载器ResourceLoader):加载配置文件、类路径资源。
    • 主配置类primarySources):通常是 @SpringBootApplication 标注的类。
    • 应用类型:推断应用类型(Servlet、Reactive 或普通 Java 应用)。
    • 初始化器ApplicationContextInitializer):自定义上下文初始化。
    • 监听器ApplicationListener):监听启动事件。
  • 加载 META-INF/spring.factories 中的 ApplicationContextInitializerApplicationListener

(2) 准备环境(Environment)

  • 作用
  • 配置运行时环境,加载属性和配置文件。
  • 过程
  • 创建 ConfigurableEnvironment(通常 StandardEnvironmentStandardServletEnvironment)。
  • 加载配置文件:
    • application.propertiesapplication.yml(默认路径:classpath:/, file:./ 等)。
    • 命令行参数(--key=value)。
    • 系统属性(System.getProperties())。
    • 环境变量。
  • 激活 Profile(如 spring.profiles.active=dev)。
  • 发布 ApplicationEnvironmentPreparedEvent 事件,通知监听器。

(3) 创建应用上下文(ApplicationContext)

  • 作用
  • 初始化 Spring 容器,管理 Bean 和依赖。
  • 过程
  • 根据应用类型创建上下文:
    • Servlet 应用:AnnotationConfigServletWebServerApplicationContext
    • Reactive 应用:AnnotationConfigReactiveWebServerApplicationContext
    • 非 Web 应用:AnnotationConfigApplicationContext
  • 配置上下文:
    • 设置环境(Environment)。
    • 应用初始化器(ApplicationContextInitializer)。
    • 加载主配置类(@SpringBootApplication)。
  • 发布 ApplicationContextInitializedEvent

(4) 自动配置(Auto-Configuration)

  • 作用
  • 根据类路径中的依赖自动配置 Spring Bean(如数据源、Web 服务器)。
  • 过程
  • 扫描 META-INF/spring.factories 中的 EnableAutoConfiguration 条目。
  • 加载 @AutoConfiguration 类(如 DataSourceAutoConfiguration)。
  • 根据条件注解(@ConditionalOnClass@ConditionalOnMissingBean 等)决定是否应用配置。
  • 示例:
    • 依赖 spring-boot-starter-web → 自动配置嵌入式 Tomcat 和 DispatcherServlet
    • 依赖 spring-boot-starter-data-jpa → 自动配置 DataSourceEntityManager
  • 发布 ApplicationPreparedEvent

(5) 刷新上下文(Refresh Context)

  • 作用
  • 初始化 Spring 容器,加载和注册所有 Bean。
  • 过程
  • 调用 AbstractApplicationContext.refresh(),执行:
    1. BeanFactory 准备:创建 DefaultListableBeanFactory,配置 Bean 定义。
    2. Bean 定义加载:扫描 @Component@Service@Controller 等注解,注册 Bean 定义。
    3. Bean 实例化:创建 Bean 实例,执行依赖注入(@Autowired)。
    4. 后处理器:执行 BeanPostProcessor(如 AOP、事务)。
    5. 初始化嵌入式服务器
    6. 创建并启动嵌入式 Web 服务器(如 Tomcat、Jetty)。
    7. 配置 DispatcherServlet(Web 应用)。
    8. 事件发布:发布 ContextRefreshedEvent
  • 处理 @PostConstruct 方法和 InitializingBean 初始化逻辑。

(6) 启动完成

  • 作用
  • 应用完全启动,接受请求或执行逻辑。
  • 过程
  • 发布 ApplicationStartedEventApplicationReadyEvent
  • 执行 CommandLineRunnerApplicationRunner(自定义启动后逻辑)。
  • 示例: java @Component public class MyRunner implements CommandLineRunner { @Override public void run(String... args) { System.out.println("Application started!"); } }
  • Web 应用开始监听端口(如 8080)。

2. 启动流程图

main() -> SpringApplication.run()
    |
    v
1. 创建 SpringApplication
    - 设置主配置类、加载 spring.factories
    |
    v
2. 准备 Environment
    - 加载 application.properties/yml、Profile
    |
    v
3. 创建 ApplicationContext
    - 根据类型创建 Servlet/Reactive 上下文
    |
    v
4. 自动配置
    - 加载 spring.factories 的 AutoConfiguration
    |
    v
5. 刷新上下文
    - 加载 Bean、初始化服务器、依赖注入
    |
    v
6. 启动完成
    - 发布事件、执行 Runner、监听端口

3. 关键组件与机制

  • @SpringBootApplication
  • 组合注解,包含:
    • @SpringBootConfiguration:标记配置类。
    • @EnableAutoConfiguration:启用自动配置。
    • @ComponentScan:扫描 @Component 等注解。
  • SpringApplication
  • 启动入口,管理初始化、事件发布。
  • Auto-Configuration
  • 基于条件(@Conditional)动态配置 Bean,简化开发。
  • Embedded Server
  • 默认 Tomcat,支持 Jetty、Undertow,自动启动。
  • Event Listener
  • 通过 ApplicationListener 监听启动事件(如 ApplicationStartedEvent)。
  • Spring Factories
  • META-INF/spring.factories 定义自动配置、初始化器、监听器。

4. 代码示例

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@Component
class MyRunner implements CommandLineRunner {
    @Override
    public void run(String... args) {
        System.out.println("Application is running!");
    }
}

配置文件application.yml):

server:
  port: 8080
spring:
  profiles:
    active: dev

运行流程: 1. main 调用 SpringApplication.run()。 2. 加载 Application 类,初始化 SpringApplication。 3. 读取 application.yml,激活 dev 环境。 4. 创建 AnnotationConfigServletWebServerApplicationContext。 5. 自动配置 Tomcat、DispatcherServlet 等。 6. 刷新上下文,注册 MyRunner Bean。 7. 启动 Tomcat(端口 8080),执行 MyRunner.run()


5. 注意事项

  • 自动配置冲突
  • 自定义配置可能覆盖自动配置,需检查 @Conditional 条件。
  • 示例:自定义 DataSource 可能禁用 DataSourceAutoConfiguration
  • 启动性能
  • 扫描过多 Bean 或复杂配置可能导致启动慢。
  • 优化:缩小 @ComponentScan 范围、延迟加载(@Lazy)。
  • 资源泄漏
  • 确保关闭上下文(SpringApplication 会自动处理)。
  • Profile 使用
  • 通过 spring.profiles.active 切换环境(如 devprod)。
  • 异常处理
  • 启动失败(如端口占用)抛 ApplicationFailedEvent,需捕获。
  • 依赖管理
  • 使用 spring-boot-starter-* 确保版本兼容。

6. 面试角度

  • 问“Spring Boot 启动流程”
  • SpringApplication.run()、环境准备、上下文创建、自动配置、刷新上下文、启动完成,说明每步作用。
  • 问“@SpringBootApplication 作用”
  • 提组合注解(@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan)。
  • 问“自动配置原理”
  • spring.factories@Conditional 条件、加载 AutoConfiguration
  • 问“嵌入式服务器如何启动”
  • 提自动配置 ServletWebServerFactory,刷新上下文时启动 Tomcat。
  • 问“如何优化启动”
  • 提减少扫描、延迟加载、精简依赖。
  • 问“事件监听”
  • ApplicationListener 监听 ApplicationStartedEvent 等,举 CommandLineRunner 示例。

7. 总结

  • 启动流程
  • 创建 SpringApplication → 准备环境(application.yml)→ 创建上下文 → 自动配置(spring.factories)→ 刷新上下文(Bean 加载、服务器启动)→ 启动完成(事件、Runner)。
  • 关键组件
  • @SpringBootApplication(配置/扫描)、自动配置(条件加载)、嵌入式服务器(Tomcat)、事件监听(ApplicationListener)。
  • 机制
  • 基于 Spring 容器,结合自动配置和嵌入式服务器,简化开发。
  • 面试建议
  • 提流程步骤、核心注解(@SpringBootApplication)、自动配置原理、代码示例(main + Runner)、优化(扫描/延迟),清晰展示理解。

If you want to dive deeper into any part (e.g., auto-configuration source code, embedded server initialization, or event listener mechanisms), let me know, and I can further refine the answer!