SpringBoot 启动流程

这篇具有很好参考价值的文章主要介绍了SpringBoot 启动流程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. 概述

    SpringBoot 是一个基于 Spring 的框架,它通过自动配置和约定大于配置的方式,简化了 Spring 应用程序的开发和部署。在本文中,我们将会深入了解 Spring Boot 的启动流程,掌握 Spring Boot 应用程序是如何启动并初始化的。

  2. 构建环境

    在了解 Spring Boot 的启动流程之前,需要先理解 Spring Boot 的构建环境。Spring Boot 支持多种构建工具,包括 Maven 和 Gradle 等。一般来说,在使用 Maven 构建 Spring Boot 应用程序时,需要将 spring-boot-starter-parentspring-boot-dependencies 作为父项目添加到 pom.xml 中;而在使用 Gradle 时,则需要在 build.gradle 文件中引入相应的依赖。

  3. 主类定义

    Spring Boot 应用程序的入口是一个 Java 类,一般称为主类。主类需要添加 @SpringBootApplication 注解,该注解包含了 @EnableAutoConfiguration@ComponentScan@Configuration 三个注解。其中,@EnableAutoConfiguration 用于启用 Spring Boot 自动配置功能,@ComponentScan 用于指定要扫描的包,@Configuration 用于标注这是一个配置类。例如:

@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}
  1. 启动流程

    Spring Boot 应用程序的启动流程可以分为四个阶段:准备阶段、刷新上下文阶段、后置处理阶段和启动失败处理阶段。下面我们将逐一深入了解每个阶段的细节。

4.1 准备阶段

在准备阶段,Spring Boot 会创建一个 SpringApplication 对象,并对其进行配置。SpringApplication 是 Spring Boot 应用程序的核心类,它负责启动和管理 Spring 应用程序。在创建 SpringApplication 时,可以通过 new SpringApplication(MyApp.class) 或者 SpringApplication.run(MyApp.class, args) 方法来指定要启动的主类。在创建 SpringApplication 对象时,Spring Boot 会自动加载应用程序默认的配置文件(application.properties 或 application.yml),并将其转化为 Spring 环境中的属性值。

4.2 刷新上下文阶段

在准备阶段结束后,Spring Boot 开始进入刷新上下文阶段。在该阶段,Spring Boot 会依次执行以下操作:

4.2.1 创建环境对象

首先,Spring Boot 会根据环境变量 SPRING_APPLICATION_JSON、命令行参数、系统属性等信息创建一个 Environment 对象,并把它设置为 Spring 环境的默认环境。Environment 对象负责管理应用程序的所有配置属性,包括命令行参数等。

4.2.2 加载配置文件

接下来,Spring Boot 会根据默认规则和自定义配置加载配置文件。在默认情况下,Spring Boot 会按照以下顺序加载配置文件:

  • file:./config/application.properties
  • file:./config/application.yml
  • classpath:/config/application.properties
  • classpath:/config/application.yml

如果需要修改默认的配置文件路径,可以在 SpringApplication.run() 方法中通过 --spring.config.location 参数指定。例如,可以通过以下方式指定配置文件路径为 /app/config/:

SpringApplication.run(MyApp.class, "--spring.config.location=/app/config/");

4.2.3 创建 SpringApplication 上下文

接着,Spring Boot 会创建一个 SpringApplication 上下文,并将 Environment 对象设置到上下文中。SpringApplication 上下文是 Spring 应用程序的核心容器,负责管理应用程序的所有 Bean。在创建 SpringApplication 上下文之前,Spring Boot 会根据 classpath 扫描包含 @Component 注解的类,并对其进行注册。这些类通常包括控制器、服务和数据访问对象等组件。

4.2.4 加载 Bean 定义

在创建 SpringApplication 上下文后,Spring Boot 会根据 Bean 定义信息生成所有 Bean 实例,并将其添加到容器中。在加载 Bean 定义时,Spring Boot 会运行所有实现了 BeanFactoryPostProcessor 接口的 BeanFactory 后置处理器。BeanFactory 后置处理器负责在创建 Bean 实例之前修改 Bean 的定义信息,例如替换默认实现、添加 AOP 切面等。

4.2.5 注册 BeanPostProcessor

在加载 Bean 定义后,Spring Boot 会注册所有实现了 BeanPostProcessor 接口的 Bean 后置处理器。Bean 后置处理器负责在 Bean 被实例化前后对其进行一些操作,例如添加代理对象、修改属性值等。

4.2.6 初始化非 Web 应用程序上下文

在完成以上操作后,Spring Boot 会初始化非 Web 应用程序上下文,包括事件监听器和组件初始化器等。这些组件通常用于应用程序初始化或清理工作,例如加载资源文件、初始化数据库连接池等。

4.2.7 刷新上下文

最后,在完成所有初始化工作之后,Spring Boot 会调用 refresh() 方法来刷新 SpringApplication 上下文。该方法会启动 Spring 应用程序并加载所有 Bean 实例,然后将上下文发布到 Spring 事件通知机制中,供其他组件使用。

4.3 后置处理阶段

在刷新上下文阶段结束后,Spring Boot 会进入后置处理阶段。在该阶段,Spring Boot 会运行所有实现了 ApplicationRunner 或 CommandLineRunner 接口的组件。这些组件通常用于应用程序启动后的初始化工作,例如读取配置文件、初始化缓存等。

4.4 启动失败处理阶段

如果在刷新 SpringApplication 上下文过程中发生异常,则 Spring Boot 会进入启动失败处理阶段。在该阶段,Spring Boot 会打印出所有异常信息,并尝试优雅地关闭 SpringApplication 上下文。如果在关闭上下文时又发生异常,则 Spring Boot 会将该异常作为新的启动异常抛出。

  1. 总结

综上所述,Spring Boot 应用程序的启动流程可以分为准备阶段、刷新上下文阶段、后置处理阶段和启动失败处理阶段。在启动过程中,Spring Boot 会自动加载配置文件、扫描包含 @Component 注解的类、生成 Bean 定义并初始化所有 Bean 实例等。因此,使用 Spring Boot 可以大大简化应用程序的开发和部署,提高生产效率和代码质量。文章来源地址https://www.toymoban.com/news/detail-461758.html

到了这里,关于SpringBoot 启动流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot启动流程

    SpringBoot的启动都需要如下的启动类 分析启动类, 可以看出核心是: 注解@SpringBootApplication 方法SpringApplication.run(SpringBootDemoApplication.class, args) 其中@SpringBootApplication之前已经了解过,如果想要了解可以查看SpringBoot自动装配原理及分析 首先new了一个SpringApplication对象 然后调用Spr

    2024年01月25日
    浏览(29)
  • SpringBoot启动流程简要

    SpringBoot启动流程大概: 初始化SpringApplication 根据项目的配置情况和Conditional条件来推断是否是一个Web应用。 读取所有jar包下面spring.factories文件,解析放入缓存,然后读取 ApplicationListener 为key的监听器,后续在SpringBoot加载的过程中会基于事件发布来做很多扩展通知。 真正的

    2024年02月15日
    浏览(24)
  • springboot启动流程 (3) 自动装配

    在SpringBoot中,EnableAutoConfiguration注解用于开启自动装配功能。 本文将详细分析该注解的工作流程。 启用SpringBoot自动装配功能,尝试猜测和配置可能需要的组件Bean。 自动装配类通常是根据类路径和定义的Bean来应用的。例如,如果类路径上有tomcat-embedded.jar,那么可能需要一个

    2024年02月09日
    浏览(32)
  • springboot启动流程 (2) 组件扫描

    SpringBoot的组件扫描是基于Spring @ComponentScan注解实现的,该注解使用basePackages和basePackageClasses配置扫描的包,如果未配置这两个参数,Spring将扫描该配置类所属包下面的组件。 在服务启动时,将使用ConfigurationClassPostProcessor扫描当前所有的BeanDefinition,解析Configuration类,如果

    2024年02月09日
    浏览(34)
  • SpringBoot内嵌Tomcat启动流程

    Spring MVC 让开发者不用了解 Servlet 细节,专注于 Controller 编写 API 接口。Spring Boot 更是采用约定大于配置的设计思想,通过内嵌 Tomcat 的方式让开发者可以快速构建并部署一个 Web 应用。怎么做到的呢? 早期的开发,一般是基于 Spring 和 Spring MVC 构建我们的应用,然后把项目打

    2024年02月02日
    浏览(31)
  • Java面试--SpringBoot启动流程

    SpringBoot 是依赖于 Spring 的,比起 Spring,除了拥有 Spring 的全部功能以外,SpringBoot 无需繁琐的 Xml 配置,这取决于它自身强大的自动装配功能;并且自身已嵌入Tomcat、Jetty 等 web 容器,集成了 SpringMvc,使得 SpringBoot 可以直接运行,不需要额外的容器,提供了一些大型项目中常

    2024年02月01日
    浏览(28)
  • SpringBoot的启动流程源码分析

    new 一个IOC容器,传入配置好的文件xml,在这个地方打bug 在这个debug的栈帧中,下面几个不用看,直接看到getBean 内容如图所示,name传的就是我们在xml的bean标签的id,这里是instanceA 进入到doGetBean后,因为我是从IOC初始化容器debug进来的所以第一次通过。 Object sharedInstance = getSingl

    2024年01月24日
    浏览(34)
  • SpringBoot启动流程及自动配置

    SpringBoot启动流程源码: 1、启动SpringBoot启动类SpringbootdemoApplication中的main方法。 2、调用SpringApplication.run(SpringbootdemoApplication.class, args),该方法是一个静态方法。 3、继续调用SpringApplication内部的run方法 ,且构建了一个SpringApplication对象,应用程序将从指定的主要来源加载Bea

    2024年02月14日
    浏览(33)
  • SpringBoot源码学习4——SpringBoot内嵌Tomcat启动流程源码分析

    系列文章目录和关于我 我在初学spring的时候,很懵逼,因为整个项目中不存在main方法,让我有点摸不着头脑。那时候我知道有个东西叫tomcat是它监听了端口,解析了协议调到了我的servlet。 在我初学SpringBoot的时候,很懵逼,有main方法了,但是tomcat在哪里呢,又是如何启动起

    2024年02月04日
    浏览(32)
  • SpringBoot3.X源码分析(启动流程)

    1 启动入口 静态辅助类,可用于运行使用默认配置(即我们添加的一系列注解)的指定源的 SpringApplication 。 primarySource - 要载入的主要源,即指定源,这里为传入的 Application.class  Class? :泛型决定了任何类都可以传入 args - 应用程序参数(通常从main方法传递) 返回:正在运

    2024年01月23日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包