Springboot详解底层启动过程

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日

相关文章

  • 用Java编写经典小程序

    让我来详细讲解一下“用Java编写经典小程序”的完整攻略。 1. 编写开发环境 首先,我们需要搭建好Java开发环境。这包括安装 JDK、配置环境变量以及选择一款IDE等步骤。一般来说,我们可以选择Eclipse、IntelliJ IDEA等Java开发工具来进行开发。 2. 设计程序结构与需求分析 在编写Java小程序之前,我们需要先进行需求分析,明确所需…

    Java 2023年5月19日
    00
  • java异常处理详细介绍及实例

    Java异常处理详细介绍及实例 什么是Java异常 Java异常是指在程序运行过程中出现的异常事件,例如文件找不到、算数异常、空指针异常等等。在程序中出现异常会导致程序的异常终止,因此程序需要处理这些异常情况。 Java异常的分类 Java异常可以分为两种类型:检查异常和未检查异常。 检查异常 检查异常是指在编译期间就会被检查出来的异常,程序在编译时需要进行…

    Java 2023年5月26日
    00
  • SpringBoot Bean花式注解方法示例上篇

    “SpringBoot Bean花式注解方法示例上篇”的完整攻略可以分为以下几部分进行讲解: 1. 介绍SpringBoot Bean 首先,介绍一下SpringBoot Bean。在SpringBoot中,Bean是指由Spring容器管理的Java对象。Bean可以通过注解的方式进行配置,并使用@Autowired注解进行依赖注入。SpringBoot的…

    Java 2023年6月3日
    00
  • java中文传值乱码问题的解决方法

    当我们在Java中传输中文字符时,经常会出现乱码问题,这是因为在Java中默认采用的是UTF-8编码,而在数据传输过程中有可能会出现编码不一致的情况。下面是解决Java中文传值乱码问题的方法攻略。 步骤一:确定编码方式 在Java中,我们可以使用String类的getBytes()方法获取字节数组,用于判断当前字符串的编码格式。一般情况下,如果编码方式是UT…

    Java 2023年5月20日
    00
  • mybatisplus添加真正的批量新增、批量更新的实现

    下面我给您详细讲解一下“mybatisplus添加真正的批量新增、批量更新的实现”的完整攻略。 理解MyBatis-Plus MyBatis-Plus是基于MyBatis的快速开发框架,提供一系列的增强功能,能够更加方便、快捷地开发数据库相关操作。其中,其批量操作功能得到了广泛的关注和应用。本文详细介绍了MyBatis-Plus批量新增、批量更新的实现方式。…

    Java 2023年5月20日
    00
  • 使用idea开发javaWeb应用程序的思路(实现用户的增删改查)

    下面我从以下几个方面来详细讲解使用Idea开发JavaWeb应用程序的思路,实现用户的增删改查: 环境准备 首先我们需要准备好Java开发环境和Web容器,推荐使用JDK8和Tomcat8。然后我们需要安装Idea开发工具。 创建JavaWeb项目 在Idea中创建一个JavaWeb项目,选择Web Application模板,并勾选Web.xml文件。创建…

    Java 2023年6月15日
    00
  • Tomcat 启动错误(8080端口被占用)处理方法

    这里是针对Tomcat启动错误(8080端口被占用)处理的完整攻略。请按以下步骤操作: 1. 查找占用8080端口的进程 打开终端或命令提示符,输入以下命令: Windows netstat -ano | findstr 8080 MacOS/Linux sudo lsof -i :8080 以上命令会列出占用8080端口的进程PID。例如: TCP 127…

    Java 2023年5月19日
    00
  • spring boot实现文件上传

    介绍 Spring Boot 是构建数千个 Servlet Web 应用程序的首选框架之一。同时,Spring Boot 集成了所有必需的控件,包括 Servlet API,WebSocket,Jackson,Validation,HttpMessageConverters 等。我们可以非常容易地在 Spring Boot 应用程序中扩展或注入新功能。 在本…

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