面试题:Spring Boot 是如何通过 main 方法启动 web 项目的?

Spring Boot 通过 main 方法启动 Web 项目的流程是其核心特性之一,它简化了传统 Spring Web 应用的启动和部署过程。以下是 Spring Boot 通过 main 方法启动 Web 项目的详细流程:


1. 入口:main 方法

  • Spring Boot 应用的启动入口是一个标准的 Java main 方法。
  • 通常,main 方法中会调用 SpringApplication.run() 方法来启动应用。

2. SpringApplication 初始化

  • 当调用 SpringApplication.run() 时,Spring Boot 会创建一个 SpringApplication 实例。
  • SpringApplication 会执行以下初始化操作:
    • 推断应用类型(如 Servlet Web 应用、Reactive Web 应用或普通应用)。
    • 设置初始化器(ApplicationContextInitializer)和监听器(ApplicationListener)。
    • 推断主配置类(通常是被 @SpringBootApplication 注解标记的类)。

3. 准备环境(Environment)

  • Spring Boot 会加载并配置应用的环境(Environment)。
  • 环境配置包括从 application.propertiesapplication.yml、命令行参数、系统属性等来源读取配置。
  • 这些配置会被加载到 Environment 对象中,供后续使用。

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

  • Spring Boot 会根据应用类型创建相应的应用上下文。
  • 对于 Web 应用,通常会创建 AnnotationConfigServletWebServerApplicationContext
  • 应用上下文是 Spring IoC 容器的核心,负责管理 Bean 的生命周期。

5. 刷新应用上下文

  • 在创建完应用上下文后,Spring Boot 会调用 refresh() 方法来刷新上下文。
  • 刷新上下文的过程包括:
    • 加载 Bean 定义(通过扫描 @Component@Service@Repository 等注解)。
    • 初始化 Bean(调用 Bean 的构造函数、依赖注入、初始化方法等)。
    • 调用 Bean 的后置处理器(如 BeanPostProcessor)。
    • 注册 Bean(将 Bean 放入 Spring 容器中)。

6. 启动内嵌的 Web 服务器

  • 如果是一个 Web 应用,Spring Boot 会自动检测并启动内嵌的 Web 服务器(如 Tomcat、Jetty 或 Undertow)。
  • 内嵌服务器的启动是通过 ServletWebServerApplicationContext 完成的。
  • 启动过程中,Spring Boot 会注册 DispatcherServlet 和其他必要的 Servlet 组件。

7. 执行 Runner

  • 在应用上下文刷新完成后,Spring Boot 会执行所有实现了 CommandLineRunner 或 ApplicationRunner 接口的 Bean。
  • 这些 Runner 通常用于在应用启动后执行一些初始化任务。

8. 发布应用启动事件

  • 在应用启动完成后,Spring Boot 会发布 ApplicationStartedEvent 和 ApplicationReadyEvent 等事件。
  • 这些事件可以用于在应用启动后执行一些自定义的逻辑。

9. 应用运行

  • 至此,Spring Boot 应用已经启动完成,进入运行状态。
  • 内嵌的 Web 服务器开始监听指定的端口(默认是 8080),等待处理 HTTP 请求。

关键点总结:

  • main 方法:是 Spring Boot 应用的启动入口,调用 SpringApplication.run() 启动应用。
  • 自动配置:Spring Boot 根据依赖自动配置 Web 服务器和其他组件。
  • 内嵌服务器:Spring Boot 内置了 Tomcat、Jetty 等 Web 服务器,无需额外部署。
  • 应用上下文:负责加载和管理 Bean,是 Spring IoC 容器的核心。
  • 事件机制:通过事件机制,开发者可以在应用启动的不同阶段执行自定义逻辑。

示例代码:

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        // 启动 Spring Boot 应用
        SpringApplication.run(MyApplication.class, args);
    }
}

总结:

Spring Boot 通过 main 方法启动 Web 项目的流程是一个高度自动化的过程。它通过自动配置、内嵌服务器、应用上下文刷新等机制,使得开发者能够快速启动和运行 Web 应用,而无需关注复杂的配置和部署细节。这种设计极大地简化了开发和运维流程,是 Spring Boot 的核心优势之一。

THE END
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容