Springboot详解底层启动过程

yizhihongxing

Spring Boot 底层启动过程

Spring Boot 启动过程分为两个阶段:Spring 应用上下文准备阶段和 Spring 应用上下文装载阶段。

Spring 应用上下文准备阶段

1. 加载 SpringApplication

Spring Boot 应用程序从 entry point 开始执行。通常情况下,入口点是使用 SpringApplication 类的静态 run() 方法启动的。

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

在静态 run() 方法中,SpringApplication 使用了以下默认值:

public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
  return new SpringApplication(primarySources).run(args);
}
  • primarySources:应用程序的主要配置类。如果您的应用程序没有任何配置类,则可以将值设置为 null,或者将其留空,因为这将是 Java 的一个 varargs 数组。
  • args:应用程序所接收的命令行参数。

2. 加载 Spring 应用程序上下文(ApplicationContext)

SpringApplication.run() 方法会创建一个 Spring 应用上下文(ApplicationContext)。在 Spring Boot 中,使用 AnnotationConfigApplicationContext 或 AnnotationConfigServletWebServerApplicationContext,这取决于您是使用 Spring Boot 还是 Spring MVC。

public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
  SpringApplicationBuilder builder = createSpringApplicationBuilder(primarySources);
  return builder.run(args);
}

private static SpringApplicationBuilder createSpringApplicationBuilder(Class<?>[] primarySources) {
  Assert.notNull(primarySources, "PrimarySources must not be null");
  return new SpringApplicationBuilder(primarySources);
}

3. 定制 SpringApplication

SpringApplication 可以定制许多属性。您可以通过其构造函数或使用 setter 设置这些属性。下面是常用的属性:

  • Banner:在应用程序启动时打印的 ASCII 标志。可以通过将“banner.txt”放在主类路径中来自定义标志。
  • Source:应用程序的主要源。
  • AdditionalProfiles:要添加到应用程序中的其他配置文件。
  • Properties:要向 SpringApplication 提供的额外属性。

4. 监听 SpringApplication 事件

SpringApplication 可以使用 addListeners() 方法或实现 ApplicationListener 接口来监听事件。可以监听以下事件:

  • ApplicationStartingEvent:应用程序开始启动时触发。
  • ApplicationEnvironmentPreparedEvent:将环境设置为上下文时触发。可以修改环境属性。
  • ApplicationContextInitializedEvent:在创建 ApplicationContext 类型之前触发,允许查看最早可用的 bean。
  • ApplicationPreparedEvent:在加载应用程序上下文(但在刷新之前)时触发。
  • ContextRefreshedEvent:在应用程序上下文刷新时触发。通常在应用程序启动后执行一些操作。
  • ServletWebServerInitializedEvent:在创建嵌入式 Servlet 容器之后触发。

Spring 应用上下文装载阶段

1. 加载配置

Spring Boot 使用多种选项来为我们的应用程序加载配置。这是 Spring Boot 配置加载的默认顺序:

  • 当前目录下的 config 子目录。
  • 当前目录。
  • classpath 下的 config 包。
  • classpath 根目录。

配置文件名称为 application。当存在多个文件时,Spring Boot 将应用程序所在的地方作为默认配置文件。例如,如果我们在主应用程序中使用 @EnableAutoConfiguration,Spring Boot 将自动搜索主应用程序中的任何 bean。

2. 加载过程监听器

当程序运行时,Spring 上下文上会出现很多监听器。可以通过使用 ApplicationContext.addApplicationListener() 将我们自己的监听器添加到 ApplicationContext 中。下面是可用的监听器:

  • ApplicationStartedEvent:ApplicationContext 加载完成后,但在它被刷新之前。
  • ApplicationReadyEvent:刷新之后间隔一段时间(之后,而不是之前)调用,以表明应用程序已经准备好接受请求。
  • ApplicationFailedEvent:如果 Spring Boot 应用程序启动时出现异常,将触发此事件。

示例一

@SpringBootApplication
public class AccountingApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(AccountingApplication.class, args);
        context.addApplicationListener(event -> {
            if (event instanceof ApplicationStartedEvent) {
                System.out.println("应用启动完成");
            }
        });
    }
}

在本示例中,我们通过 SpringApplication.run() 方法实例化 Spring Boot 应用程序,并添加了一个自定义的 ApplicationStartedEvent 监听器。这个监听器在应用程序启动完成后会打印出一条信息。

示例二

public class MyApplication {

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(MyApplication.class);
        application.addListeners(new ApplicationPidFileWriter());
        application.run(args);
    }
}

在本示例中,我们实例化了一个 Spring Boot 应用程序,并添加了一个 ApplicationPidFileWriter 监听器。这个监听器在应用程序正常关闭时,将应用程序的 PID 写入到文件中。可以在 /tmp/myapplication.pid 文件中找到 PID。

以上就是 Spring Boot 底层启动过程的完整攻略,包含了示例以及代码解释。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Springboot详解底层启动过程 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • 自适应布局meta标签中viewport、content、width、initial-scale、minimum-scale、maximum-scale总结

    下面我来详细讲解一下“自适应布局meta标签中viewport、content、width、initial-scale、minimum-scale、maximum-scale总结”的完整攻略。 首先,我们来了解一下各个属性的含义。这里以移动设备浏览器为例: viewport:视口,用于设置浏览器的视口大小。 content:用于控制一些meta属性的设置,例…

    Java 2023年6月15日
    00
  • Java OOP三大特征之封装继承与多态详解

    Java OOP三大特征之封装、继承与多态详解 概述 Java中的面向对象编程(OOP)是通过三大特征来支持的,它们分别是:封装、继承和多态。 本文将详细讲解Java OOP三大特征之封装、继承与多态的定义和实现方式,帮助读者深入理解Java面向对象编程的核心概念。 封装 封装是指将数据和方法包裹成一个类,并对外提供有限的访问权限。封装可以隐藏类的实现细节,…

    Java 2023年5月26日
    00
  • 解决RestTemplate 的getForEntity调用接口乱码的问题

    RestTemplate是Spring框架提供的用于进行HTTP请求的工具,但是在使用getForEntity方法调用接口时,会出现中文乱码的问题。 解决这个问题可以分为两个步骤: 设置RestTemplate的编码方式 在使用RestTemplate的时候,需要设置它的编码方式。可以在创建RestTemplate对象时,传入一个StringHttpMess…

    Java 2023年5月20日
    00
  • Java 中限制方法的返回时间最新方法

    下面我将详细讲解“Java 中限制方法的返回时间最新方法”的完整攻略。 1. 背景 在某些场景下,我们需要限制某些方法的返回时间,以避免对系统资源的过度占用或者对用户造成不良体验等问题。 然而,Java 原生并没有提供限制方法返回时间的接口或者关键字,因此我们需要通过一些技巧来实现这个功能。 2. 解决方案 2.1 使用 ExecutorService 实现…

    Java 2023年5月20日
    00
  • Java 实战项目锤炼之嘟嘟健身房管理系统的实现流程

    Java 实战项目锤炼之嘟嘟健身房管理系统的实现流程 一、需求分析 系统包含三个角色:管理员、健身房教练、健身房会员。 系统功能: 管理员:添加教练、添加会员、管理教练、管理会员、查看销售业绩。 教练:发布健身计划、管理个人信息。 会员:查看健身计划、预约课程、管理个人信息。 系统特色功能:会员课程提醒、打卡记录、数据分析。 二、技术选型 开发语言:Java…

    Java 2023年5月24日
    00
  • Java8并行流中自定义线程池操作示例

    让我们来详细讲解一下“Java8并行流中自定义线程池操作示例”的完整攻略。 一、背景介绍 我们在使用Java8中的流处理时,有时会用到并行流来提升处理速度。但是默认情况下,在并行流中并行执行的线程数是由系统自动决定的,这可能不符合我们的需求。因此,我们需要自定义线程池来控制并行流中执行的线程数,从而提高代码的性能。 二、自定义线程池 Java多线程编程中,线…

    Java 2023年5月18日
    00
  • Java 仿天猫服装商城系统的实现流程

    Java 仿天猫服装商城系统的实现流程 概述 Java 仿天猫服装商城系统是一种基于Java语言实现的电商系统,主要用于展示服装商品,实现用户注册、登录、购物车、订单等基本功能的实验项目。在本文中,将详细介绍Java 仿天猫服装商城系统的实现流程。 技术栈 Java 仿天猫服装商城系统的实现需要掌握以下技术栈: Spring Boot:Java框架,用于快速…

    Java 2023年5月24日
    00
  • MyBatis后端对数据库进行增删改查等操作实例

    下面是MyBatis后端对数据库进行增删改查等操作实例的详细攻略: 1. 准备工作 在进行MyBatis操作之前,我们需要准备好以下内容: 数据库:我们需要在本地或远程服务器上搭建好相应的数据库,并在其中创建好表格。 MyBatis环境:我们需要使用Maven或Gradle等工具引入MyBatis相关依赖,并在项目中配置好MyBatis的相关信息,如数据库连…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部