一文带你了解SpringBoot的启动原理

 更新时间:2023年05月16日 11:42:11   作者:算.子  
大家通常只需要给一个类添加一个@SpringBootApplication 注解,然后再加一个main 方法里面固定的写法 SpringApplication.run(Application.class, args);那么spring boot 到底是如何启动服务的呢,接下来咱们通过源码解析,需要的朋友可以参考下

Spring Boot 的启动原理可以概括为以下几个步骤:

  • 加载 Spring Boot 应用程序的启动类
  • 根据启动类所在的包路径扫描相关的类
  • 根据扫描到的类自动配置 Spring 应用程序
  • 启动嵌入式的 Web 服务器
  • 运行 Spring 应用程序

Spring Boot 启动过程的源码剖析:

@SpringBootApplication // 标记该类为 Spring Boot 应用程序的启动类
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args); // 执行 Spring Boot 应用程序
    }
}

在 Spring Boot 应用程序的启动类中,需要使用 @SpringBootApplication 注解标记该类,以告诉 Spring Boot 这是应用程序的启动类。@SpringBootApplication 注解包含了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 这三个注解,分别表示该类是配置类、开启自动配置和扫描组件。

在 main 方法中,调用 SpringApplication.run 方法来启动 Spring Boot 应用程序。该方法接受两个参数,第一个参数是启动类的类对象,第二个参数是主方法的参数。在 SpringApplication.run 方法中,会执行以下几个步骤:

  • 创建一个 SpringApplication 对象,该对象包含了所有的 Spring Boot 应用程序配置信息。
  • 根据 SpringApplication 对象中的配置信息,创建一个 ApplicationContext 对象,该对象是 Spring 应用程序的上下文。
  • 将所有的 @Configuration 类型的类注册到 ApplicationContext 对象中。
  • 根据 @EnableAutoConfiguration 注解,自动配置 Spring 应用程序。
  • 扫描所有的 @Component 注解的类,并将其注册到 ApplicationContext 中。
  • 启动嵌入式的 Web 服务器。
  • 运行 Spring 应用程序。

下面是 SpringApplication.run 方法的源码注释:

public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
    return run(new Class<?>[] { primarySource }, args);
}

public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
    // 创建 SpringApplication 对象,包含了所有的 Spring Boot 应用程序配置信息
    SpringApplication application = new SpringApplication(primarySources);
    // 运行 Spring Boot 应用程序,并返回上下文对象
    return application.run(args);
}

public ConfigurableApplicationContext run(String... args) {
    // 创建并启动 ConfigurableApplicationContext 对象,返回该对象
    ConfigurableApplicationContext context = createApplicationContext();
    // 执行 Spring 应用程序的监听器
    listeners.starting(this.applicationArguments);
    try {
        // 准备 ApplicationContext 环境
        prepareEnvironment(context, this.environment);
        // 配置 ApplicationContext
        configureIgnoreBeanInfo(context);
        // 执行所有的 ApplicationContextInitializer
        applyInitializers(context);
        // 执行所有的 SpringApplicationRunListener 的 starting 方法
        listeners.contextPrepared(context);
        // 打印 Spring Boot 应用程序的 Banner
        Banner printedBanner = printBanner();
        // 创建 ApplicationContext
        context.refresh();
        // 将 ApplicationContext 注册到 JVM 关闭钩子中
        prepareContext(context, printedBanner);
        // 执行所有的 ApplicationContextInitializer 的 postProcessApplicationContext 方法
        postProcessApplicationContext(context);
        // 执行所有的 SpringApplicationRunListener 的 contextLoaded 方法
        listeners.contextLoaded(context);
    }
    catch (Throwable ex) {
        handleRunFailure(context, ex, listeners);
        throw new IllegalStateException(ex);
    }

    try {
        // 执行所有的 SpringApplicationRunListener 的 started 方法
        listeners.started(context);
        // 启动嵌入式的 Web 服务器
        callRunners(context, this.applicationArguments);
    }
    catch (Throwable ex) {
        handleRunFailure(context, ex, listeners);
        throw new IllegalStateException(ex);
    }

    try {
        // 执行所有的 SpringApplicationRunListener 的 running 方法
        listeners.running(context);
    }
    catch (Throwable ex) {
        handleRunFailure(context, ex, listeners);
        throw new IllegalStateException(ex);
    }

    return context;
}

在 SpringApplication.run 方法中,还会调用一些其他的方法,如 prepareEnvironment、applyInitializers、postProcessApplicationContext、callRunners 等,这些方法是 Spring Boot 应用程序启动的关键步骤,它们会对应用程序进行配置、初始化、启动等操作。

以上就是一文带你了解SpringBoot的启动原理的详细内容,更多关于SpringBoot启动原理的资料请关注脚本之家其它相关文章!

相关文章

  • Java web访问http://localhost:8080/xx/xx.jsp报404错误问题的解决方法

    Java web访问http://localhost:8080/xx/xx.jsp报404错误问题的解决方法

    这篇文章主要给大家介绍了关于Java web访问http://localhost:8080/xx/xx.jsp报404错误问题的解决方法,很多小伙伴在刚开始用Springboot整合jsp开发时都会遇到这个问题, 按照别人的教程一步一步搭建,但就是会报404,文中介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • Spring Boot应用事件监听示例详解

    Spring Boot应用事件监听示例详解

    这篇文章主要给大家介绍了关于Spring Boot应用事件监听的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • eclipse下整合springboot和mybatis的方法步骤

    eclipse下整合springboot和mybatis的方法步骤

    这篇文章主要介绍了eclipse下整合springboot和mybatis的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • Java多线程编程中synchronized线程同步的教程

    Java多线程编程中synchronized线程同步的教程

    Java的synchronized关键字可以修饰方法和对象来构建线程间的同步,这里我们就来共同学习Java多线程编程中synchronized线程同步的教程:
    2016-07-07
  • 一文了解Java读写锁ReentrantReadWriteLock的使用

    一文了解Java读写锁ReentrantReadWriteLock的使用

    ReentrantReadWriteLock称为读写锁,它提供一个读锁,支持多个线程共享同一把锁。这篇文章主要讲解一下ReentrantReadWriteLock的使用和应用场景,感兴趣的可以了解一下
    2022-10-10
  • springboot prototype设置多例不起作用的解决操作

    springboot prototype设置多例不起作用的解决操作

    这篇文章主要介绍了springboot prototype设置多例不起作用的解决操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java中stream的用法详细解读

    Java中stream的用法详细解读

    这篇文章主要介绍了Java中stream的用法详细解读,Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作,使用Stream API 对集合数据进行操作,就类似于使用SQL执行的数据库查询,需要的朋友可以参考下
    2023-10-10
  • Java并发编程必备之Synchronized关键字深入解析

    Java并发编程必备之Synchronized关键字深入解析

    本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种使用方式:修饰代码块、修饰普通方法和修饰静态方法,感兴趣的朋友一起看看吧
    2025-04-04
  • 详谈Java中instanceof和isInstance的区别

    详谈Java中instanceof和isInstance的区别

    下面小编就为大家带来一篇详谈Java中instanceof和isInstance的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • log4j 详解异步日志的配置和测试

    log4j 详解异步日志的配置和测试

    这篇文章主要介绍了 log4j 详解异步日志的配置和测试的相关资料,需要的朋友可以参考下
    2017-01-01

最新评论