Springboot的启动流程

75°C 20-03-2025 notbyai
最近更新于:2025-03-20 19:57:50

1. 主入口与 SpringApplication.run()

  • 入口方法
    一般在应用的主类中有 public static void main(String[] args) 方法,该方法调用了 SpringApplication.run(Application.class, args)
  • SpringApplication 对象的创建
    通过 run() 方法,Spring Boot 创建了一个 SpringApplication 实例,这个实例负责整个启动流程的协调工作。

2. 准备阶段

  • Environment 准备
    在正式创建 Spring 应用上下文之前,Spring Boot 会先准备好环境(Environment),包括加载配置文件(如 application.properties 或 application.yml)、系统环境变量、命令行参数等信息,并解析成 Environment 对象。
  • Banner 展示
    在环境准备过程中,Spring Boot 会加载并打印启动 Banner。Banner 可以是默认的,也可以自定义。
  • 初始器(Initializers)和监听器(Listeners)注册
    根据配置,Spring Boot 会注册各类初始器和事件监听器,这些组件会在后续的启动过程中接收各类启动事件(如 ApplicationStartingEvent、ApplicationPreparedEvent、ApplicationReadyEvent 等)。

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

  • 选择容器类型
    Spring Boot 根据项目依赖和配置选择合适的 ApplicationContext 实现。例如,对于 Web 应用,会使用 AnnotationConfigServletWebServerApplicationContext,而对于非 Web 应用则使用 AnnotationConfigApplicationContext
  • 实例化上下文
    调用 createApplicationContext() 方法创建对应的上下文实例。

4. Bean 定义加载与上下文刷新

  • 加载 Bean 定义
    Spring Boot 通过扫描(Component Scan)、配置类(@Configuration)等方式加载所有需要注册的 Bean 定义。
  • 上下文刷新(refresh())
    在调用 refresh() 方法时,Spring 会完成:
    • BeanFactory 的初始化
      注册所有的 Bean 定义、处理依赖注入、应用 AOP 等;
    • BeanPostProcessor 的应用
      在 Bean 实例化前后进行各种处理,如注解解析、事务增强等;
    • 事件发布
      在关键时刻触发相应的启动事件通知注册的监听器。

5. Embedded Web Server 的启动(针对 Web 应用)

  • 启动嵌入式服务器
    对于 Spring Boot Web 应用,会自动配置并启动嵌入式的 Web 服务器(如 Tomcat、Jetty 或 Undertow)。在上下文刷新过程中,会创建服务器工厂并启动服务器。
  • DispatcherServlet 初始化
    随后会初始化并注册 DispatcherServlet,负责接收并分发 HTTP 请求。

6. ApplicationRunner 和 CommandLineRunner 执行

  • 运行自定义逻辑
    当所有 Bean 都已初始化完毕,并且上下文已经刷新后,Spring Boot 会查找并执行所有实现了 ApplicationRunnerCommandLineRunner 接口的 Bean,这些组件可以在应用启动完成后执行特定的业务逻辑。

7. 应用启动完成

  • 发布 ApplicationReadyEvent
    当所有启动步骤都完成后,Spring Boot 会发布一个 ApplicationReadyEvent 事件,表明应用已经完全启动并且可以开始接收请求。
  • 等待请求
    对于 Web 应用来说,嵌入式服务器此时已经在监听端口等待 HTTP 请求;对于其他类型应用,则进入运行状态等待任务执行或事件触发。

总结

整个启动过程可以概括为:

  1. 入口调用与环境准备:main 方法 -> SpringApplication.run() -> 加载配置与初始化环境
  2. 上下文创建与 Bean 加载:实例化 ApplicationContext -> 加载并注册 Bean 定义 -> 刷新上下文
  3. 嵌入式服务器启动(Web 应用):启动并配置内置 Web 服务器
  4. 启动后逻辑执行:执行 ApplicationRunner/CommandLineRunner -> 应用完全启动并准备就绪

Spring Boot 的启动流程可以概括为以下几个主要步骤:

  1. 启动入口: 程序从 main 方法开始执行,通常调用 SpringApplication.run(Application.class, args),这一步骤负责启动整个 SpringBoot 应用。
  2. 环境准备与Banner打印: 在运行 SpringApplication.run() 时,会初始化 SpringApplication 对象。这个过程中会准备好 Environment(包括读取配置文件、命令行参数等),同时还会打印出启动 Banner。
  3. ApplicationContext 的创建: 根据应用类型(比如 Web 应用或非 Web 应用),Spring Boot 会自动选择合适的 ApplicationContext 实现(例如 AnnotationConfigServletWebServerApplicationContext
    AnnotationConfigApplicationContext),并进行实例化。
  4. BeanDefinition 的加载与注册: Spring Boot 会扫描和加载所有的配置类以及自动装配的组件。这里包括对用户自定义配置类和自动配置类的处理,进而注册所有的 Bean 定义到容器中。
  5. ApplicationContext 的刷新: 调用 refresh() 方法,完成对容器的初始化,这一过程中会实例化所有单例 Bean,并触发 Bean 的生命周期回调,如@PostConstructInitializingBeanafterPropertiesSet() 等。
  6. 监听器与Runner的执行: Spring Boot 启动过程中会触发各种事件(如 ApplicationStartedEventApplicationReadyEvent),同时执行实现了CommandLineRunnerApplicationRunner 接口的组件,用于在应用启动完成后执行特定逻辑。
  7. 启动完成: 至此,Spring Boot 应用完成启动,等待接收请求或执行相应的业务逻辑。

评论留言

欢迎您,!您可以在这里畅言您的的观点与见解!

0 条评论